Calling python from C with OpenMP
MRAB
python at mrabarnett.plus.com
Fri May 13 13:12:08 EDT 2016
On 2016-05-13 17:22, Øystein Schønning-Johansen wrote:
> On Friday, May 13, 2016 at 2:04:53 AM UTC+2, Sturla Molden wrote:
>> You must own the GIL before you can safely use the Python C API, object
>> creation and refcounting in particular. Use the "Simplified GIL API" to
>> grab the GIL and release it when you are done.
>
> I've now read about the GIL and it looks like I am in deep problems.
>
> I've added the GILState lock to the threaded loop like this:
>
> #pragma omp parallel for
> for( int i = 0; i < 10; i++ ){
> PyGILState_STATE gstate;
> gstate = PyGILState_Ensure();
> PyObject *ret = PyObject_CallMethod( mult_obj, "do_multiply", "i", i );
> if( !ret ){
> printf("Cannot call 'do_multiply'\n");
> continue;
> }
> printf("The value calculated in Python was: %3d\n", (int) PyLong_AsLong(ret));
> Py_DECREF(ret);
> PyGILState_Release(gstate);
> }
>
> .... but still no success. Have I done it right?
>
> regs,
> -Øystein
>
Every PyGILState_Ensure call must be matched with a PyGILState_Release
call. The way it's currently written, it won't call PyGILState_Release
if ret is NULL.
However, I don't think you'll gain much here because you can gain from
multi-threading only if the threads can run in parallel. You need to
hold the GIL while making Python calls, and only 1 thread can hold the
GIL at any time.
More information about the Python-list
mailing list