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?