[SciPy-user] some benchmark data for numarray, Numeric and scipy-newcore
Ted Horst
ted.horst at earthlink.net
Mon Dec 5 02:24:52 CST 2005
On Dec 4, 2005, at 16:57, Travis Oliphant wrote:
> The other issue of vector-vector and vector-scalar operations, I'm less
> convinced about. Do we really need a whole other class of functions
> in
> the ufunc machinery. If so, I'm inclined to included them in the math
> operations for array-scalars, rather than the ufunc machinery.
The thing that led me to this was that scipy was spending a lot more
time in DOUBLE_multiply than numarray was spending in
multiply_ddxd_vvxv. Since the functions are equivalent,
DOUBLE_multiply must be getting called more than multiply_ddxd_vvxv.
My first guess was that this was because in numarray vetcor-scalar
multiplies were going through multiply_ddxd_svxv. I tried to add a
test for that by changing (the source to) DOUBLE_multiply to the
following:
/**begin repeat
#TYP=FLOAT,DOUBLE,LONGDOUBLE#
#typ=float,double,longdouble#
*/
static void
@TYP at _multiply(char **args, intp *dimensions, intp *steps, void *func)
{
register intp i;
intp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];
char *i1=args[0], *i2=args[1], *op=args[2];
/* fprintf(stderr, "Multiplying %d elements of type @typ@\n", n);
fprintf(stderr, "args= %p, %p, %p\n", i1, i2, op);
fprintf(stderr, "steps=%d, %d, %d\n", is1, is2, os); */
if (is1 == 0) {
@typ@ temp = *(@typ@ *)i1;
for(i=0; i<n; i++, i2+=is2, op+=os) {
*((@typ@ *)op)=temp * *((@typ@ *)i2);
}
}
else if (is2 == 0) {
@typ@ temp = *(@typ@ *)i2;
for(i=0; i<n; i++, i1+=is1, op+=os) {
*((@typ@ *)op)=temp * *((@typ@ *)i1);
}
}
else {
for(i=0; i<n; i++, i1+=is1, i2+=is2, op+=os) {
*((@typ@ *)op)=*((@typ@ *)i1) * *((@typ@ *)i2);
}
}
}
/**end repeat**/
But there was still a lot of time spent in the else clause even when I
was only testing scalar-vector multiplication. I think this has
something to do with the ufunc buffers and broadcasting, but I got a
bit lost at this point.
Another observation is that scipy's LONG_remainder is much slower than
numarray's remainder_iixi_vsxv. LONG_remainder calculates the
remainder using floating point math whereas numarray just uses the C %
operator.
Hope this is useful.
Ted
More information about the SciPy-user
mailing list