Re: Evaluation control in Compile[]

*To*: mathgroup at smc.vnet.net*Subject*: [mg119385] Re: Evaluation control in Compile[]*From*: Oliver Ruebenkoenig <ruebenko at wolfram.com>*Date*: Wed, 1 Jun 2011 04:34:42 -0400 (EDT)

On Tue, 31 May 2011, Szabolcs Horv=E1t wrote: > 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. >> > > > Hi, does this help? f[x_] := x + 1 f1 = Compile[{{x, _Integer, 0}}, f[x]] f1[1] << "CompiledFunctionTools`" CompilePrint[f1] System`SetSystemOptions[ "CompileOptions" -> "CompileReportExternal" -> True]; f2 = Compile[{{x, _Integer, 0}}, f[x]] Oliver