2012-04-11 14 views
0

Ich implementierte eine einfache Matrixvektormultiplikation für dünn besetzte Matrizen in CRS unter Verwendung einer impliziten openMP-Direktive in der Multiplikationsschleife.OpenMP mit Beschränkungszeigern schlägt mit ICC fehl, während GCC/G ++ erfolgreich ist

Der vollständige Code ist in GitHub: https://github.com/torbjoernk/openMP-Examples/blob/icc_gcc_problem/matxvec_sparse/matxvec_sparse.cpp
Hinweis: Es ist hässlich ;-)

Um den privaten und gemeinsam genutzten Speicher zu steuern Ich bin mit Zeigern beschränken. Kompilieren mit GCC 4.6.3 auf 64bit Linux funktioniert gut (neben zwei Warnungen über %u und unsigned int in einem printf Befehl, aber das ist nicht der Punkt).

Es ist jedoch mit ICC 12.1.0 auf 64-Bit-Linux kompiliert Failes mit dem Fehler:

matxvec_sparse.cpp(79): error: "default_n_row" must be specified in a variable list at enclosing OpenMP parallel pragma 
    #pragma omp parallel \ 
    ^

mit der Definition der Variablen und Zeiger in Frage

int default_n_row = 4; 
int *n_row = &default_n_row; 

und die OpenMP-Richtlinie definiert als

#pragma omp parallel \ 
    default(none) \ 
    shared(n_row, aval, acolind, arowpt, vval, yval) \ 
    private(x, y) 
{ 
    #pragma omp for \ 
    schedule(static) 
    for (x = 0; x < *n_row; x++) { 
    yval[x] = 0; 
    for (y = arowpt[x]; y < arowpt[x+1]; y++) { 
     yval[x] += aval[y] * vval[ acolind[y] ]; 
    } 
    } 
} /* end PARALLEL */ 

Zusammengestellt mit g ++:

c++ -fopenmp -O0 -g -std=c++0x -Wall -o matxvec_sparse matxvec_sparse.cpp 

mit icc Zusammengestellt:

icc -openmp -O0 -g -std=c++0x -Wall -restrict -o matxvec_sparse matxvec_sparse.cpp 

  • Ist es ein Fehler bei Verwendung von GCC/ICC?
  • Ist dies ein Design-Problem in meinem Code verursacht undefiniertes Verhalten?
    Wenn ja, welche Zeile (n) verursacht es?
  • Ist es nur Inkonsistenz zwischen ICC und GCC?
    Wenn ja, was wäre ein guter Weg, um die Unabhängigkeit und Kompatibilität des Compilers zu erreichen?

Antwort

1

Huh. Mit Blick auf den Code ist klar, was Icpc denkt, das Problem ist, aber ich bin mir nicht sicher, ohne durch die Spezifikation zu gehen, welcher Compiler hier das Richtige tut, g ++ oder Icpc.

Das Problem ist nicht das restrict Schlüsselwort; Wenn Sie alle ausnehmen und die Option -restrict an Icpc verlieren, bleibt das Problem bestehen. Das Problem ist, dass Sie in diesem parallelen Abschnitt haben default(none) shared(n_row...), aber ist, am Anfang des Programms, ein Zeiger auf default_n_row. Und Icpc erfordert, dass default_n_row auch geteilt werden (oder zumindest etwas) in diesem omp-parallelen Abschnitt.