[Numpy-discussion] Cython numerical syntax revisited
Sturla Molden
sturla@molden...
Thu Mar 5 04:48:31 CST 2009
On 3/5/2009 10:11 AM, Dag Sverre Seljebotn wrote:
> Cython can relatively easily transform things like
>
> cdef int[:,:] a = ..., b = ...
> c = a + b * b
Now you are wandering far into Fortran territory...
> If a and b are declared as contiguous arrays and "restrict", I suppose
> the C compiler could do the most efficient thing in a lot of cases?
> (I.e. "cdef restrict int[:,:,"c"]" or similar)
A Fortran compiler can compile a vectorized expression like
a = b*c(i,:) + sin(k)
into
do j=1,n
a(j) = b(j)*c(i,j) + sin(k(j))
end do
The compiler do this because Fortran has strict rules prohibiting
aliasing, and because the instrinsic function sin is declared
'elemental'. On the other hand, if the expression contains functions not
declared 'elemental' or 'pure', there may be side effects, and temporary
copies must be made. The same could happen if the expression contained
variables declared 'pointer', in which case it could contain aliases.
I think in the case of numexpr, it assumes that NumPy ufuncs are
elemental like Fortran intrinsics.
Matlab's JIT compiler works with the assumption that arrays are
inherently immutable (everything has copy-on-write semantics). That
makes life easier.
> However if one has a strided array, numexpr could still give an
> advantage over such a loop. Or?
Fortran compilers often makes copies of strided arrays. The trick is to
make sure the working arrays fit in cache. Again, this is safe when the
expression only contains 'elemental' or 'pure' functions. Fortran also
often does "copy-in copy-out" if a function is called with a strided
array as argument.
S.M.
More information about the Numpy-discussion
mailing list