2010-05-12 2 views
18

Ho un ciclo nel mio codice C++/OpenMP che assomiglia a questo:Perché non sono consentite le variabili di indice OpenMP non firmate?

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

Quando compilo esso (con Visual Studio 2005) ottengo il seguente errore:

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

I capire che l'errore si verifica perché i non è firmato anziché firmato e se si modifica i da firmare rimosso questo errore. Quello che voglio sapere è perché è un errore? Perché non sono consentite variabili indice non firmate? Guardando la pagina MSDN per questo errore non mi dà alcun indizio.

risposta

12

In base allo OpenMP 2.0 C/C++ API specification (pdf), sezione 2.4.1, questa è una delle restrizioni del ciclo for. Non viene fornito alcun motivo, ma sospetto che sia solo per semplificare le supposizioni che il codice e il compilatore devono fare, poiché esiste un codice speciale per garantire che l'intervallo non superi il valore massimo del tipo.

OpenMP 3.0 a quanto pare consente anche i tipi senza segno, ma non l'ho ancora visto in azione.

2

Il compilatore Microsoft C/C++ 12.0 integrato con Visual Studio 2013 supporta ancora solo OpenMP 2.5 e non consente unsigned int per il contatore di loop.

Il supporto GCC OpenMP 3.0 dalla versione 4.4 e consente unsigned int per il contatore di loop.

+0

Siamo precisi qui: i compilatori MS C/C++ in bundle con VS 2013 potrebbero non supportare OpenMP dopo v2.5 ma i compilatori Intel, che si integrano abbastanza bene con VS, supportano OpenMP 3.1. Se altri compilatori che si integrano con VS supportano lo standard più recente che non conosco. –

+0

A destra, corretto. –