2010-10-21 11 views
6

Estoy aprendiendo OpenMP de los tutoriales y recursos en línea. Quiero cuadrar una matriz (multiplicarla consigo misma) utilizando un ciclo parallel for. En IBM compiler documentation, encontré el requisito de que "la variable de iteración debe ser un entero signed". ¿Esto también es cierto en la implementación de GCC? ¿Está especificado en el estándar OpenMP? Si es así, ¿hay alguna razón para este requisito?¿Por qué las variables de bucle se deben firmar en paralelo para?

(No importa tanto como las dimensiones esperadas son mucho menores que INT_MAX, pero sí me ha costado unos moldes.)

+0

Esta pregunta fue marcada como una trampa de [este] (http://stackoverflow.com/questions/2820621), pero hay una diferencia, que es que estaba específicamente interesado en OpenMP de GCC. –

Respuesta

5

De acuerdo con la especificación de OpenMP 3.0: http://www.openmp.org/mp-documents/spec30.pdf, para la variable puede ser de tipo entero con signo o sin signo, vea 2.5.1 Construcción de bucle. La pregunta es si la implementación de OpenMP cumple con esta última especificación.

+0

Aceptado porque la restricción se ha eliminado en 3.0, por lo que probablemente no haya una buena razón para ello en primer lugar. –

8

Citando Why aren't unsigned OpenMP index variables allowed?:

De acuerdo con la especificación OpenMP 2.0 C/C++ API (pdf), sección 2.4.1, esa es una de las restricciones del ciclo for. No hay ninguna razón se da para ello, pero sospecho que es sólo a simplificar los supuestos de que el código y el compilador tienen que hacer, ya que , existe un código especial para asegurar que el rango no se desborde el valor máximo del tipo .

OpenMP 3.0 aparentemente también admite tipos sin firmar, pero aún no he visto en acción.

En resumen, es parte del estándar y la próxima versión permitirá enteros sin signo.

+0

Estoy atrapado con GCC 4.3, que implementa OpenMP 2.5. Voy a convertir mi 'size_t' en' int' por ahora. –

7

Aquí hay una posible razón detrás de eso. El same article dice que

  • b, ub, incr son bucle invariantes firmado expresiones enteras y
  • exit_cond toma forma: iv <= ub o iv < ub o iv >= ub o iv > ub (donde iv es la variable de iteración de preguntar acerca)

desde la condición exit_cond implica una comparación y la comparación se realiza contra una variable ub con signo, la variable de bucle iv tiene que estar firmado para evitar posibles problemas con la comparación firmada/no firmada.

+1

+1 por la razón. Siempre es bueno saber ** por qué ** las cosas son como son. – pmg

+2

Lo que plantea la pregunta de por qué las otras expresiones deben ser 'signed'. –

+0

Hm, esa no es una razón real. Si es el motivo, debe tener los límites y el contador del mismo tipo, incluida la firma. Esa que compraría. –

1

Para responder a su primera pregunta sobre gcc. No, parece que gcc acepta fácilmente unsigned o size_t variables de bucle en algo así como

#pragma omp parallel for 
for (size_t i = 0; i < N; ++i) { 
    /* do it */ 
} 

al menos la mía (gcc 4.4 v en un Ubuntu de 64 bits) no se queja y hace lo correcto.

Cuestiones relacionadas