[Date Index]
[Thread Index]
[Author Index]
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
Prev by Date:
**Re: Even and Odd functions**
Next by Date:
**Re: NDSolve issues with initial and boundary conditions (corrected characters)**
Previous by thread:
**Re: Evaluation control in Compile[]**
Next by thread:
**Re: Parallelize vs Compile**
| |