MathGroup Archive 2011

[Date Index] [Thread Index] [Author Index]

Search the Archive

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.
>



  • Prev by Date: Re: Pure functions and Select[] sequential elements of list
  • Next by Date: Re: Pure functions and Select[] sequential elements of list
  • Previous by thread: Re: Evaluation control in Compile[]
  • Next by thread: Re: Question on making a piecewise function periodic tia sal2