[Numpy-svn] r2804 - trunk/numpy/core/src
numpy-svn at scipy.org
numpy-svn at scipy.org
Tue Jul 11 20:01:04 EDT 2006
Author: oliphant
Date: 2006-07-11 19:01:01 -0500 (Tue, 11 Jul 2006)
New Revision: 2804
Modified:
trunk/numpy/core/src/arrayobject.c
Log:
Add GIL-releasing calls
Modified: trunk/numpy/core/src/arrayobject.c
===================================================================
--- trunk/numpy/core/src/arrayobject.c 2006-07-11 21:50:11 UTC (rev 2803)
+++ trunk/numpy/core/src/arrayobject.c 2006-07-12 00:01:01 UTC (rev 2804)
@@ -346,6 +346,7 @@
}
}
#undef _FAST_MOVE
+
}
@@ -357,6 +358,7 @@
char *tout = dst;
char *tin = src;
+
#define _MOVE_N_SIZE(size) \
for (i=0; i<N; i++) { \
memmove(tout, tin, size); \
@@ -380,6 +382,7 @@
_MOVE_N_SIZE(elsize);
}
#undef _MOVE_N_SIZE
+
}
static void
@@ -397,7 +400,7 @@
tout += outstrides; \
} \
return
-
+
switch(elsize) {
case 8:
_COPY_N_SIZE(8);
@@ -413,6 +416,7 @@
_COPY_N_SIZE(elsize);
}
#undef _COPY_N_SIZE
+
}
static void
@@ -420,6 +424,9 @@
{
char *a, *b, c=0;
int j,m;
+
+ NPY_BEGIN_THREADS_DEF
+ NPY_BEGIN_THREADS
switch(size) {
case 1: /* no byteswap necessary */
@@ -456,6 +463,10 @@
}
break;
}
+
+ NPY_BEGIN_THREADS_DEF
+ NPY_BEGIN_THREADS
+
}
static void
@@ -717,6 +728,8 @@
void (*myfunc)(char *, intp, char *, intp, intp, int);
int retval=-1;
+ NPY_BEGIN_THREADS_DEF
+
numcopies = PyArray_SIZE(dest);
if (numcopies < 1) return 0;
nbytes = PyArray_ITEMSIZE(src);
@@ -745,15 +758,22 @@
if ((dest->nd < 2) || PyArray_ISONESEGMENT(dest)) {
char *dptr;
intp dstride;
+
dptr = dest->data;
if (dest->nd == 1)
dstride = dest->strides[0];
else
dstride = nbytes;
PyArray_XDECREF(dest);
+
+ NPY_BEGIN_THREADS
+
myfunc(dptr, dstride, sptr, 0, numcopies, (int) nbytes);
if (swap)
_strided_byte_swap(dptr, dstride, numcopies, (int) nbytes);
+
+ NPY_END_THREADS
+
PyArray_INCREF(dest);
}
else {
@@ -763,6 +783,7 @@
PyArray_IterAllButAxis((PyObject *)dest, &axis);
if (dit == NULL) goto finish;
PyArray_XDECREF(dest);
+ NPY_BEGIN_THREADS
while(dit->index < dit->size) {
myfunc(dit->dataptr, PyArray_STRIDE(dest, axis),
sptr, 0,
@@ -773,6 +794,7 @@
PyArray_DIM(dest, axis), nbytes);
PyArray_ITER_NEXT(dit);
}
+ NPY_END_THREADS
PyArray_INCREF(dest);
Py_DECREF(dit);
}
@@ -794,11 +816,15 @@
int axis;
int elsize;
intp nbytes;
+ NPY_BEGIN_THREADS_DEF
+
if (PyArray_NDIM(src) == 0) {
PyArray_XDECREF((PyArrayObject *)dst);
+ NPY_BEGIN_THREADS
memcpy(PyArray_BYTES(dst), PyArray_BYTES(src),
PyArray_ITEMSIZE(src));
+ NPY_END_THREADS
PyArray_INCREF((PyArrayObject *)dst);
return 0;
}
@@ -824,6 +850,7 @@
elsize = PyArray_ITEMSIZE(dst);
nbytes = elsize * PyArray_DIM(src, axis);
PyArray_XDECREF((PyArrayObject *)dst);
+ NPY_BEGIN_THREADS
while(it->index < it->size) {
myfunc(dptr, elsize, it->dataptr,
PyArray_STRIDE(src,axis),
@@ -831,6 +858,7 @@
dptr += nbytes;
PyArray_ITER_NEXT(it);
}
+ NPY_END_THREADS
PyArray_INCREF((PyArrayObject *)dst);
Py_DECREF(it);
@@ -846,6 +874,7 @@
int maxaxis=-1, elsize;
intp maxdim;
PyArrayIterObject *dit, *sit;
+ NPY_BEGIN_THREADS_DEF
dit = (PyArrayIterObject *) \
PyArray_IterAllButAxis((PyObject *)dest, &maxaxis);
@@ -862,6 +891,8 @@
elsize = PyArray_ITEMSIZE(dest);
PyArray_XDECREF(dest);
+
+ NPY_BEGIN_THREADS
while(dit->index < dit->size) {
/* strided copy of elsize bytes */
myfunc(dit->dataptr, dest->strides[maxaxis],
@@ -876,6 +907,8 @@
PyArray_ITER_NEXT(dit);
PyArray_ITER_NEXT(sit);
}
+ NPY_END_THREADS
+
Py_DECREF(sit);
Py_DECREF(dit);
PyArray_INCREF(dest);
@@ -890,6 +923,7 @@
int elsize;
PyArrayMultiIterObject *multi;
int maxaxis; intp maxdim;
+ NPY_BEGIN_THREADS_DEF
elsize = PyArray_ITEMSIZE(dest);
multi = (PyArrayMultiIterObject *)PyArray_MultiIterNew(2, dest, src);
@@ -906,6 +940,7 @@
PyArray_XDECREF(dest);
+ NPY_BEGIN_THREADS
while(multi->index < multi->size) {
myfunc(multi->iters[0]->dataptr,
multi->iters[0]->strides[maxaxis],
@@ -919,6 +954,8 @@
}
PyArray_MultiIter_NEXT(multi);
}
+ NPY_END_THREADS
+
Py_DECREF(multi);
PyArray_INCREF(dest);
return 0;
@@ -942,7 +979,9 @@
void (*myfunc)(char *, intp, char *, intp, intp, int);
int simple;
int same;
+ NPY_BEGIN_THREADS_DEF
+
if (!PyArray_EquivArrTypes(dest, src)) {
return PyArray_CastTo(dest, src);
}
@@ -959,10 +998,12 @@
if (simple) {
PyArray_XDECREF(dest);
+ NPY_BEGIN_THREADS
if (usecopy)
memcpy(dest->data, src->data, PyArray_NBYTES(dest));
else
memmove(dest->data, src->data, PyArray_NBYTES(dest));
+ NPY_END_THREADS
PyArray_INCREF(dest);
return 0;
}
@@ -1007,7 +1048,8 @@
int elsize, simple;
PyArrayIterObject *idest, *isrc;
void (*myfunc)(char *, intp, char *, intp, intp, int);
-
+ NPY_BEGIN_THREADS_DEF
+
if (!PyArray_EquivArrTypes(dest, src)) {
return PyArray_CastAnyTo(dest, src);
}
@@ -1030,7 +1072,9 @@
if (simple) {
PyArray_XDECREF(dest);
+ NPY_BEGIN_THREADS
memcpy(dest->data, src->data, PyArray_NBYTES(dest));
+ NPY_END_THREADS
PyArray_INCREF(dest);
return 0;
}
@@ -1054,11 +1098,13 @@
if (isrc == NULL) {Py_DECREF(idest); return -1;}
elsize = dest->descr->elsize;
PyArray_XDECREF(dest);
+ NPY_BEGIN_THREADS
while(idest->index < idest->size) {
memcpy(idest->dataptr, isrc->dataptr, elsize);
PyArray_ITER_NEXT(idest);
PyArray_ITER_NEXT(isrc);
}
+ NPY_END_THREADS
PyArray_INCREF(dest);
Py_DECREF(idest);
Py_DECREF(isrc);
More information about the Numpy-svn
mailing list