2016-04-18 10 views
3

Ich habe eine Funktion, die Zeiger double als Argument hat, die als restrict qualifiziert sind. Beachten Sie, dass der Intel-Compiler restrict verwendet, aber wir ersetzen den Qualifier durch __restrict__ im Falle von GCC.Compiler-Fehler mit restric Qualifier auf bestimmten C++ - Compiler

void Stats::calc_flux_2nd(double* restrict data, 
          double* restrict datamean, 
          double* restrict w) 
{ 
    // ... 

    // Set a pointer to the field that contains w, 
    // either interpolated or the original 
    double* restrict calcw = w; 

    // ... 

Dieser Code kompiliert ohne Probleme GCC oder Clang verwenden, aber der IBM Bluegene Compiler gibt den folgenden Fehler:

(W) Incorrect assignment of a restrict qualified pointer. 
Only outer-to-inner scope assignments between restrict pointers are 
allowed. This may result in incorrect program behavior. 

Ich verstehe nicht, wie man diesen Fehler interpretieren, wie ich das nicht ändern Signatur der Variablen, noch weiß ich, ob ich ein undefiniertes Verhalten einführe oder ob der IBM BlueGene Compiler falsch ist.

+2

Beschränken ist nur ein C-Schlüsselwort, soweit ich sagen kann, ist es kein C++ - Schlüsselwort. –

+0

@Chiel Wenn Sie die Zuweisung zur Variablen "w" entfernen, verschwindet die Warnung? Es klingt, als würde restrict im Vergleich zu den GCC/clang-Versionen nicht genau funktionieren. – Leandros

+0

@Leandros Wenn ich eine Deklaration ohne Zuweisung einführe, löst sie keine Fehler aus. Offensichtlich mag IBM es nicht gern, einem 'doppelten * restrict' ein 'double * restrict' zuzuweisen, obwohl meiner Meinung nach kein Risiko besteht. Ich kann mir vorstellen, dass das Zuweisen eines nicht einschränkenden Zeigers zu einer eingeschränkten Variablen ein undefiniertes Verhalten auslösen kann, aber das verwirrt mich ... – Chiel

Antwort

4

Ihr Konstrukt wird nicht vom XL C/C++ - Compiler von IBM unterstützt, es wird auch in documentation angegeben. Sie können keine eingeschränkten Zeiger zuweisen. Sie können dies beheben, indem Sie einen neuen Blockbereich und eine neue Reihe von Zeigern erstellen.

{ 
    int * restrict x; 
    int * restrict y; 
    x = y; /* undefined */ 
    { 
    int * restrict x1 = x; /* okay */ 
    int * restrict y1 = y; /* okay */ 
    x = y1; /* undefined */ 
    } 
} 
+1

Ich weiß, dass es kein offizielles Schlüsselwort in C++ ist, aber alle relevanten Compiler unterstützen es, und ohne es ist es fast unmöglich, Code zu schreiben, der richtig vektorisiert. Trotzdem warnt mich IBM vor undefiniertem Verhalten und ich möchte sicher sein, dass wir das nicht in unseren Code einführen. – Chiel

+0

Soweit ich weiß, IBM Compiler sind etwas GNU C-kompatibel, versuchen Sie mit "__restrict__" oder "__restrict", anstatt der offiziellen C-Schlüsselwort. – Leandros

+1

Ich benutze das richtige Restrict-Schlüsselwort für den richtigen Compiler, das ist nicht, wo der Fehler ist. – Chiel