2011-01-06 22 views
5

En una función miembro, que puede paralelizar el uso de la variable miembro compartido int *x como esto¿Por qué la variable de miembro de clase x no se puede compartir (x) en OpenMP?

#pragma omp parallel for default(shared) 
for(int i=0;i<size;i++) { 
    x[i]=i; 
} 

Pero si intento

#pragma omp parallel for default(none) shared(x,size) 
for(int i=0;i<size;i++) { 
    x[i]=i; 
} 

me sale el error: 'obj::x' is not a variable in clause 'shared'. Preferiría la segunda versión porque anuncia las variables compartidas con las que está trabajando, y me recuerda que debo asegurarme de que no haya condiciones de carrera o problemas similares.

¿Qué está pasando que OpenMP afirma que obj::x no es una variable?

+0

¿Has probado esto-> x? también qué compilador estás usando? – Beanz

+0

el compilador es g ++ 4.4. Probando '#pragma omp parallel para default (none) shared (this-> x, size)' da el error 'error: esperado id-no-calificado antes 'this'' –

Respuesta

11

mayoría de las implementaciones de OpenMP esbozan la región paralelo. Es decir, lo hacen una función. Las variables privadas generalmente se pasan a esta función y las variables compartidas se pueden pasar o estar dentro del alcance de la función. El problema con los miembros de datos de clase es que no son lo mismo que las variables.

Cuando el compilador describe una región paralela, las variables tienen ubicaciones de almacenamiento definidas que el compilador puede configurar para pasar a la función. Los miembros de datos no se pueden crear instancias (es decir, almacenamiento asignado) hasta que se llame a la clase durante la ejecución del programa. Esto significa que el compilador no puede privatizar miembros de datos por sí mismo. También tendría que hacerse en el tiempo de ejecución y esto causaría mucho más trabajo y afectaría el rendimiento de los programas en serie y en paralelo. Hasta ahora, ninguna implementación ha intentado hacer este trabajo y dado que la especificación OpenMP está escrita por consenso, se tomó la decisión de no permitir miembros de datos en todas las cláusulas. De lo contrario, parecía demasiado confuso decir que están permitidos en cláusulas compartidas, pero ninguna otra cláusula.

1

No sabe precisiely - pero echar un vistazo a través de 32 OpenMP traps for C++ developers para solucionar la mayoría de problemas de OpenMP

+1

¡Gracias por el enlace! –

+0

No encontré ninguna referencia a mi pregunta en el documento vinculado. ¿Puedes ser mas específico? –

+0

Lamento no tener la respuesta precisa, esperaba que hubiera algo en el enlace para ayudarte –

Cuestiones relacionadas