Re: Compile and Total
- To: mathgroup at smc.vnet.net
- Subject: [mg120308] Re: Compile and Total
- From: "Oleksandr Rasputinov" <oleksandr_rasputinov at hmamail.com>
- Date: Mon, 18 Jul 2011 06:13:55 -0400 (EDT)
- References: <201107150120.VAA23682@smc.vnet.net> <ivosnc$q79$1@smc.vnet.net>
In[1] :=
On[Compile::noinfo]; (* New in Mathematica 8 *)
SetSystemOptions[
"CompileOptions" -> {"CompileReportExternal" -> True}
];
In[2] :=
g[x_] := Total[x]
gC = Compile[{{x, _Real, 1}}, g@x]
During evaluation of In[2] :=
Compile::noinfo: No information is available for compilation of g[x]. The
compiler will use an external evaluation and make assumptions about the
return type. >>
During evaluation of In[2] :=
Compile::exttensor: g[x] cannot be compiled and will be evaluated
externally. The result is assumed to be a rank 1 tensor of type Real. >>
Out[2] =
CompiledFunction[{x}, g[x], -CompiledCode-]
One note of caution: if nested Function calls are passed to Compile along
with "InlineExternalDefinitions" -> True, the calls at level 1 and deeper
are not inlined, although Compile can successfully un-nest and perform
common subexpression elimination on them if they are inlined manually (or
otherwise; the code to inline these explicitly is not very hard to write).
On Sat, 16 Jul 2011 10:47:00 +0100, Yves Klett <yves.klett at googlemail.com>
wrote:
> I wonder if in general a message/warning about MainEvaluate-calls should
> be issued.
>
> Regards,
> Yves
>
> Am 15.07.2011 10:11, schrieb DrMajorBob:
>> Mathematica isn't compiling EITHER of your user functions, error message
>> or not. Both functions are SetDelayed and Compile has Attribute HoldAll,
>> hence Compile knows zero, zip, nada about g and h.
>>
>> Compile does replace Total with a compiled version:
>>
>> << CompiledFunctionTools`
>>
>> fC = Compile[{{x, _Real, 1}}, Total[x]];
>> CompilePrint@fC
>>
>> "
>> 1 argument
>> 1 Integer register
>> 1 Real register
>> 1 Tensor register
>> Underflow checking off
>> Overflow checking off
>> Integer overflow checking on
>> RuntimeAttributes -> {}
>>
>> T(R1)0 = A1
>> I0 = 4
>> Result = R0
>>
>> 1 R0 = TotalAll[ T(R1)0, I0]]
>> 2 Return
>> "
>>
>> For g, no such luck:
>>
>> g[x_] := Total[x]
>> gC = Compile[{{x, _Real, 1}}, g@x];
>> CompilePrint@gC
>>
>> "
>> 1 argument
>> 2 Tensor registers
>> Underflow checking off
>> Overflow checking off
>> Integer overflow checking on
>> RuntimeAttributes -> {}
>>
>> T(R1)0 = A1
>> Result = T(R1)1
>>
>> 1 T(R1)1 = MainEvaluate[ Hold[g][ T(R1)0]]
>> 2 Return
>> "
>>
>> And for h (despite the lack of an error message):
>>
>> h[x_] := x/Total[x]
>> hC = Compile[{{x, _Real, 1}}, h[x], {{_Total, _Real}}];
>> CompilePrint@hC
>>
>> "
>> 1 argument
>> 2 Tensor registers
>> Underflow checking off
>> Overflow checking off
>> Integer overflow checking on
>> RuntimeAttributes -> {}
>>
>> T(R1)0 = A1
>> Result = T(R1)1
>>
>> 1 T(R1)1 = MainEvaluate[ Hold[h][ T(R1)0]]
>> 2 Return
>> "
>>
>> Bobby
- References:
- Compile and Total
- From: Neil Stewart <neil.stewart@warwick.ac.uk>
- Compile and Total