2010-05-12 12 views
18

Ich habe eine Schleife in meinem C++/OpenMP-Code, der wie folgt aussieht:Warum sind keine OpenMP-Indexvariablen ohne Vorzeichen zulässig?

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

Wenn ich es kompilieren (mit Visual Studio 2005) bekomme ich folgende Fehlermeldung:

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

I Verstehen Sie, dass der Fehler auftritt, da i nicht signiert und unsigniert ist, und i zu ändern geändert werden, um diesen Fehler zu entfernen. Was ich wissen will ist warum ist das ein Fehler? Warum sind nicht vorzeichenlose Indexvariablen zulässig? Ein Blick auf die MSDN Seite für diesen Fehler gibt mir keine Hinweise.

Antwort

12

Gemäß der OpenMP 2.0 C/C++ API specification (pdf), Abschnitt 2.4.1, das ist eine der Einschränkungen der for Schleife. Es gibt keinen Grund dafür, aber ich vermute, dass es nur die Annahmen vereinfacht, die der Code und der Compiler machen müssen, da es einen speziellen Code gibt, der sicherstellt, dass der Bereich den Maximalwert des Typs nicht überschreitet.

OpenMP 3.0 erlaubt anscheinend auch nicht signierte Typen, aber ich habe es noch nicht in Aktion gesehen.

2

Der in Visual Studio 2013 integrierte Microsoft C/C++ - Compiler 12.0 unterstützt nur OpenMP 2.5 und lässt unsigned int für den Schleifenzähler nicht zu.

GCC-Unterstützung OpenMP 3.0 seit seiner Version 4.4 und ermöglicht unsigned int für den Schleifenzähler.

+0

Lassen Sie uns hier präzisieren: die mit VS 2013 gebündelten MS C/C++ Compiler unterstützen OpenMP möglicherweise nicht nach V2.5, aber die Intel Compiler, die gut genug mit VS integrieren, unterstützen OpenMP 3.1. Ob andere Compiler, die in VS integrieren, den neueren Standard unterstützen, weiß ich nicht. –

+0

Richtig, korrigiert. –

Verwandte Themen