Re: Evaluation control in Compile[]
- To: mathgroup at smc.vnet.net
- Subject: [mg119350] Re: Evaluation control in Compile[]
- From: Szabolcs Horvát <szhorvat at gmail.com>
- Date: Tue, 31 May 2011 07:48:49 -0400 (EDT)
- References: <irvrqm$8hh$1@smc.vnet.net>
Dear MathGroup members, After reading this question, I started wondering if there is any way to receive warnings that there might be something "wrong" with a compiled function (e.g. that Mathematica might drop back to standard evaluation instead of running compiled code). CCodeGenerate[] does issue some warnings: CCodeGenerate[GetLongitudeDegreeLength, "fun"] CCodeGenerate::wmreq: "The expression Function[{latitude},latitudeDegreeLength] requires Mathematica to be evaluated. The function will be generated but can be expected to fail with a nonzero error code when executed" Is there a way to get some similar warnings from Compile[]? It is not obvious and intuitive that using an e.g. elsewhere defined constant might slow down a compiled function to non-compiled speed. GetLongitudeDegreeLength = Function[{latitude}, latitudeDegreeLength*Cos[latitude Degree]] Timing[Map[GetLongitudeDegreeLength,X];] is only 1.5 slower on my machine than the compiled version (with non-inlined constants). (I know that Map can auto-compile its argument, but setting SetSystemOptions["CompileOptions" -> "MapCompileLength" -> Infinity] doesn't seem to change anything here, so I assume that the timing is valid for the uncompiled case) On 2011.05.30. 12:33, Ben wrote: > I'd like to compile a function that estimates (assuming a spherical > earth) the length of a degree of longitude at any particular > latitude. Here's how I write it up and test its speed: > > In[1]:= radiusOfEarth=6378100.; > latitudeDegreeLength=2*Pi*radiusOfEarth/360 > Out[2]= 111319. > In[3]:= X=Table[RandomReal[{0,90}],{100000}]; > In[4]:= > GetLongitudeDegreeLength=Compile[{latitude},latitudeDegreeLength*Cos[latitude > Degree]] > Out[4]= CompiledFunction[{latitude},latitudeDegreeLength Cos[latitude > =B0],-CompiledCode-] > In[5]:= Timing[Map[GetLongitudeDegreeLength,X];] > Out[5]:= {0.312,Null} > > Since the values of "latitudeDegreeLength" and "Degree" are constant, > I'd prefer to use numerical approximations in the definition so the > compiled code doesn't have to request the values of these global > variables at runtime. Like this: > > In[6]:= GetLongitudeDegreeLength=Compile[{latitude}, > 111318.*Cos[0.0174532925 latitude]] > Out[6]:= CompiledFunction[{latitude},111318. Cos[0.0174533 latitude],- > CompiledCode-] > In[7]:= Timing[Map[GetLongitudeDegreeLength,X];] > Out[7]:= {0.031,Null} > > Is there any way to tell Mathematica that I'd like these symbols to be > evaluated before the compilation so that I don't have to copy and > paste the numerical values into the definition? > > Thanks. >