2010-05-12 5 views
18

Tengo un bucle en mi código C++/OpenMP que tiene este aspecto:¿Por qué no se permiten variables de índice OpenMP sin firmar?

#pragma omp parallel for 
for(unsigned int i=0; i<count; i++) 
{ 
    // do stuff 
} 

Cuando compilo (con Visual Studio 2005) me sale el siguiente error:

error C3016: 'i' : index variable in OpenMP 'for' statement must have signed integral type

I Entiendo que el error ocurre porque i no está firmado en lugar de estar firmado, y al cambiar i para firmar se eliminó este error. Lo que quiero saber es ¿por qué es esto un error? ¿Por qué no se permiten variables de índice sin firmar? Ver la página MSDN para este error no me da pistas.

Respuesta

12

De acuerdo con OpenMP 2.0 C/C++ API specification (pdf), sección 2.4.1, esa es una de las restricciones del lazo for. No se da ninguna razón para ello, pero sospecho que es solo para simplificar las suposiciones que tienen que hacer el código y el compilador, ya que hay un código especial para garantizar que el rango no desborde el valor máximo del tipo.

OpenMP 3.0 aparentemente también permite tipos sin firmar, pero todavía no lo he visto en acción.

2

El Microsoft C/C++ Compiler 12.0 integrado con Visual Studio 2013 solo admite OpenMP 2.5 y no permite unsigned int para el contador de bucles.

Compatibilidad GCC OpenMP 3.0 desde su versión 4.4 y permite unsigned int para el contador de bucles.

+0

Seamos precisos aquí: los compiladores MS C/C++ incluidos con VS 2013 pueden no admitir OpenMP después de v2.5 pero los compiladores Intel, que se integran lo suficientemente bien con VS, sí admiten OpenMP 3.1. No sé si otros compiladores que se integran con VS admiten el estándar más reciente. –

+0

Derecha, corregida. –

Cuestiones relacionadas