2011-04-13 11 views
5

Hola, Tengo una lista muy larga de variables compartidas en OpenMP, así que tengo que dividir las líneas en fortran y usar la sintaxis "&" para asegurarme de que las líneas permanecen unidas.OpenMP ¿Varias directivas "compartidas"?

Algo así:

!$OMP PARALLEL DEFAULT(private) SHARED(vars...., 
    & more_vars..., 
    & more_vars... 
    &) 

Eso me da errores al compilar sin OpenMP, ya que sólo el primero como se reconoce como un comentario! El problema ahora es que no puedo agregar un "!" frente a aquellas líneas con un "&" delante para apoyar la compilación sin OpenMP:

!$OMP PARALLEL DEFAULT(private) SHARED(vars...., 
!  & more_vars..., 
!  & more_vars... 
!  &) 

, porque de lo que no se compila con OpenMP nunca más ... Pero quiero apoyar ambos tipos de compilar en un solo código ... ¿Algún consejo sobre cómo hacerlo?

Respuesta

8

No está utilizando la sintaxis correcta. Si nos fijamos en la especificación OpenMP V3.0, sección 2.1.2 Directivas libre de código de formulario, verá lo siguiente:

El centinela puede aparecer en cualquier columna, siempre que es precedida sólo por el espacio blanco (espacios y caracteres de pestañas). Debe aparecer como una sola palabra sin intercalar el carácter . La longitud de línea de forma libre de Fortran, el espacio en blanco y las reglas de continuación se aplican a la línea de directiva . Las líneas de directiva iniciales deben tener un espacio después del centinela. Las líneas directivas continuas deben tener un ampersand como el último carácter no en blanco en la línea, anterior a cualquier comentario colocado dentro de la directiva. Las líneas directivas de continuación pueden tener un ampersand después del centinela directivo con espacio en blanco opcional antes y después del ampersand .

Así que la forma correcta debe ser:

!$OMP PARALLEL DEFAULT(private) SHARED(vars...., & 
!$OMP& more_vars..., & 
!$OMP& more_vars... & 
!$OMP&) 

Para una forma fija, que es el mismo tipo de cosas. Comience cada línea con el centinela OMP y asegúrese de que las líneas de continuación tengan un carácter distinto de cero y en blanco en la columna 6.

+0

¡Oh, gracias, no lo sabía! ¡Eso me ayudó mucho! – tim

+0

Lo siento, estaba equivocada, que no funciona para mí: error de sintaxis , encontrado 'y' cuando se esperaba una de:/ tim

+1

Qué compilador está usando? Además, mi ejemplo era de forma gratuita, aunque su ejemplo realmente se parece más a que está utilizando una forma fija. Si es una forma fija, solo necesita tener el centinela y la columna 6 en blanco (es decir, c $ omp + shared_var, shared_var,) en las líneas de continuación. – ejd

0

Bien chicos ... descubrí la solución: el identificador de bucle (quiero decir, en el siguiente código: do i=1,end) tiene que ser compartida y como estoy usando DEFAULT(private) tuve que escribir esto en la lista de vars compartida :) Espero que esto ayude a alguien algún día :)

+1

Como no ha demostrado cómo está utilizando este ciclo, es posible que lo que está diciendo sea correcto. Sin embargo, en general, si tiene un bucle dentro de una región paralela, desea que el índice de bucle sea privado. De hecho, de forma predeterminada, OpenMP hará que el índice de bucle sea privado para que no tenga una condición de carrera. Este comentario también parece no estar relacionado con la pregunta original, así que no estoy seguro de cómo es la mejor respuesta. – ejd

+0

Oh, lo siento, sí, tenías razón, lo siento por esto; Originalmente quería publicar esto en mi pregunta "OpenMP en Fortran: ¿cambios en los tipos de datos?" pero lo eché a perder, ¡lo siento! Sin embargo, creo que el índice de bucle no puede ser privado, ¿está seguro de su afirmación? No puedo ver por qué el programa funciona inmediatamente al configurarlo para compartir. No puedo publicar el código porque es demasiado largo y no sabría qué quitar, pero como funciona ahora, probablemente no sea necesario. – tim