Wie kompiliere ich ein OpenMP-Programm mit clang?

9

Mein gcc kompiliert gut, aber clang schlägt mit der folgenden Meldung fehl:

clang -fopenmp=libomp -o main main.c
main.c:5:10: fatal error: 'omp.h' file not found

Ich habe auch das libomp5Paket installiert und das Flag in geändert -fopenmp=libomp5, obwohl es auch nicht geholfen hat:

clang -fopenmp=libomp5 -o main main.c
clang: error: unsupported argument 'libomp5' to option 'fopenmp='
clang: error: unsupported argument 'libomp5' to option 'fopenmp='

Diese Empfehlungen haben nicht funktioniert.

Wäre dankbar für Hinweise zur Installation notwendiger 16.04-spezifischer Pakete und zum Übergeben entsprechender Flags.

Bulat M.
quelle
Welche Version von Clang verwenden Sie? Ich habe das gleiche Problem übrigens mit Clang-3.8 und Clang-3.9 unter Ubuntu 16.10.
Z Boson
1
sudo apt install libomp-dev
Z Boson
Endlich kann ich OpenMP mit Clang unter Ubuntu verwenden! Ich wollte das schon lange!.
Z Boson

Antworten:

16

Ich hatte das gleiche Problem.

sudo apt install libomp-dev

Es wurde mit Ubuntu 16.10 behoben

//test.c
#include "omp.h"
#include <stdio.h>

int main(void) {
  #pragma omp parallel
  printf("thread %d\n", omp_get_thread_num());
}

Dann

clang test.c -fopenmp
./a.out
thread 0
thread 5
thread 2
thread 1
thread 7
thread 3
thread 4
thread 6

Ebenfalls

clant-3.9 test.c -fopenmp

funktioniert.


GCC und Clang verwenden unterschiedliche OpenMP-Laufzeitbibliotheken: libgomp bzw. libomp.

Clangs Laufzeit ist die LLVM OpenMP- Laufzeit, die wiederum auf der Intel OpenMP-Laufzeit (Open Source) basiert. https://www.openmprtl.org/

Auf meinem System installiert GCC omp.hunter

/usr/lib/gcc/x86_64-linux-gnu/6/include/omp.h

und libomp-devinstalliert omp.hbei

/usr/include/omp.h

Dies sind verschiedene Header-Dateien, die unterschiedliche Funktionsdefinitionen enthalten. Es mag in Ordnung sein, eine der Header-Dateien für zB zu verwenden, omp_get_wtime()aber im Allgemeinen denke ich, dass es wahrscheinlich besser ist, die Header-Datei zu verwenden, die der Laufzeit entspricht, mit der verknüpft ist.

Z Boson
quelle
1
Arbeitete an Vanille 16.04 mit Stock Clang in Repos.
Bulat M.
1
Ich habe gerade Ubuntu 17.04 installiert, das standardmäßig Clang 4.0 ist. Ich musste still noch benutzen sudo apt install libomp.dev.
Z Boson
Wenn Sie versehentlich libgomp von clang 6 aus verknüpfen, wird Ihr Code stillschweigend serialisiert.
Andrew Wagner
2

Es scheint omp.h Datei nicht in Ihrem System vorhanden PATH . Versuchen Sie zunächst, die Datei omp.h zu finden , wenn Sie nicht wissen, wo sie sich befindet:

find / -name 'omp.h' -type f

Führen Sie dann diesen Befehl aus, um Ihren Code zu kompilieren:

clang -o main main.c -I/path/to/omp/folder
Ghasem Pahlavan
quelle
Das behebt das Problem nicht. Es kann immer noch nicht finden omp.h.
Z Boson
Haben Sie omp.h in Ihrem System gefunden? Können Sie die Ausgabe dieser Befehle an Ihre Frage anhängen?
Ghasem Pahlavan
*.hsind Header-Dateien, warum sollte er sie seinem Pfad hinzufügen wollen? Sie sollten /usr/includezum Beispiel dabei sein.
Ravexina
1
Danke Ghasem, libomp-dev Installation am 16.04 gelöst.
Bulat M.