[Cython] prange CEP updated

mark florisson markflorisson88 at gmail.com
Wed May 4 13:59:29 CEST 2011


On 4 May 2011 13:54, Dag Sverre Seljebotn <d.s.seljebotn at astro.uio.no> wrote:
> On 05/04/2011 01:48 PM, mark florisson wrote:
>>
>> On 4 May 2011 13:47, mark florisson<markflorisson88 at gmail.com>  wrote:
>>>
>>> On 4 May 2011 13:45, Dag Sverre Seljebotn<d.s.seljebotn at astro.uio.no>
>>>  wrote:
>
>>>> Look.
>>>>
>>>> i = 42
>>>> for i in prange(n):
>>>>    f(i)
>>>> print i # want 42 whenever n == 0
>>>>
>>>> Now, translate this to:
>>>>
>>>> i = 42;
>>>> #pragma omp parallel for firstprivate(i) lastprivate(i)
>>>> for (temp = 0; ...; ...) {
>>>>    i = ...
>>>> }
>>>> #pragma omp parallel end
>>>> /* At this point, i == 42 if n == 0 */
>>>>
>>>> Am I missing something?
>>>
>>> Yes, 'i' may be uninitialized with nsteps>  0 (this should be valid
>>> code). So if nsteps>  0, we need to initialize 'i' to something to get
>>> correct behaviour with firstprivate.
>
> This I don't see. I think I need to be spoon-fed on this one.

So assume this code

cdef int i

for i in prange(10): ...

Now if we transform this without the guard we get

int i;

#pragma omp parallel for firstprivate(i) lastprivate(i)
for (...) { ...}

This is invalid C code, but valid Cython code. So we need to
initialize 'i', but then we get our "leave it unaffected for 0
iterations" paradox. So we need a guard.

>>  And of course, if you initialize 'i' unconditionally, you change 'i'
>> whereas you might have to leave it unaffected.
>
> This I see.
>
> Dag Sverre
> _______________________________________________
> cython-devel mailing list
> cython-devel at python.org
> http://mail.python.org/mailman/listinfo/cython-devel
>


More information about the cython-devel mailing list