Ik gebruik Mac OS X Sierra en ik ontdekte dat clang (LLVM versie 8.1.0 (clang-802.0.38)) OpenMP niet ondersteunt:
toen ik clang -fopenmp program_name.c
uitvoerde, kreeg ik de volgende foutmelding:
clang: error: unsupported option '-fopenmp'
Het lijkt erop dat clang de vlag -fopenmp
niet ondersteunt.
Ik kon geen openmp-bibliotheek vinden in homebrew. Volgens de LLVM-website ondersteunt LLVM al OpenMP. Maar ik kon tijdens het compileren geen manier vinden om het in te schakelen.
Betekent dit dat de standaardclang in Mac OpenMP niet ondersteunt?
Kunt u suggesties doen?
(Als ik overschakel naar GCC om hetzelfde programma te compileren (gcc is geïnstalleerd met behulp van brew install gcc --without-multilib
), en de compilatie is geslaagd.)
Antwoord 1, autoriteit 100%
Probeer het gebruik van Homebrew‘s llvm:
brew install llvm
Je hebt dan alle binaire bestanden van llvm in /usr/local/opt/llvm/bin
. Als u bijvoorbeeld het OpenMP Hello World-programmawilt compileren, typt u
/usr/local/opt/llvm/bin/clang -fopenmp -L/usr/local/opt/llvm/lib omp_hello.c -o hello
Misschien moet u ook de CPPFLAGS
instellen met -I/usr/local/opt/llvm/include
.
Een makefile zou er als volgt uit moeten zien:
CPP = /usr/local/opt/llvm/bin/clang
CPPFLAGS = -I/usr/local/opt/llvm/include -fopenmp
LDFLAGS = -L/usr/local/opt/llvm/lib
omp_hello: omp_hello.c
$(CPP) $(CPPFLAGS) $^ -o $@ $(LDFLAGS)
Update:in macOS 10.14 (Mojave) krijg je mogelijk een foutmelding zoals
/usr/local/Cellar/llvm/7.0.1/lib/clang/7.0.1/include/omp.h:118:13: fatal error: 'stdlib.h' file not found
Als dit gebeurt, ontbreken de macOS SDK-headers in /usr/include
. Ze zijn naar de SDK zelf verhuisd met Xcode 10. Installeer de headers in /usr/include
met
open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
Update 2:Het voorbeeldbestand omp_hello.c
lijkt te zijn verdwenen uit de directe link hierboven, dus hier is het:
/******************************************************************************
* FILE: omp_hello.c
* DESCRIPTION:
* OpenMP Example - Hello World - C/C++ Version
* In this simple example, the master thread forks a parallel region.
* All threads in the team obtain their unique thread number and print it.
* The master thread only prints the total number of threads. Two OpenMP
* library routines are used to obtain the number of threads and each
* thread's number.
* AUTHOR: Blaise Barney 5/99
* LAST REVISED: 04/06/05
******************************************************************************/
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{
int nthreads, tid;
/* Fork a team of threads giving them their own copies of variables */
#pragma omp parallel private(nthreads, tid)
{
/* Obtain thread number */
tid = omp_get_thread_num();
printf("Hello World from thread = %d\n", tid);
/* Only master thread does this */
if (tid == 0)
{
nthreads = omp_get_num_threads();
printf("Number of threads = %d\n", nthreads);
}
} /* All threads join master thread and disband */
}
Antwoord 2, autoriteit 69%
Andere mensen hebben een oplossing gegeven (met behulp van Homebrew llvm). Je kunt OpenMP ook gebruiken met Apple Clang en Homebrew libomp (brew install libomp
). Vervang gewoon een commando als clang -fopenmp test.c
door clang -Xpreprocessor -fopenmp test.c -lomp
.
Antwoord 3, autoriteit 31%
MacOS Mojave met CMake
-
Installeer LLVM met openmp en libomp met brew
brew update brew install llvm libomp
-
voeg directory’s en linkdirectories toe in
CMakeList.txt
include_directories("/usr/local/include" "/usr/local/opt/llvm/include") link_directories("/usr/local/lib" "/usr/local/opt/llvm/lib")
-
voer CMake uit met de nieuwe compilers
cmake -DCMAKE_C_COMPILER="/usr/local/opt/llvm/bin/clang" -DCMAKE_CXX_COMPILER="/usr/local/opt/llvm/bin/clang++" ..
De clang-versie is 7.0.1 op het moment van schrijven
Antwoord 4
Conda-gebaseerde compilatieomgeving
Conda gebruikt clang voor OSX-compilatie (paraplupakket cxx-compiler
), maar ik kwam soortgelijke problemen tegen bij het gebruik van llvm-openmp
en de -fopenmp
vlag gooien fouten. De oplossing lijkt veel op andere antwoorden, maar ik vermeld het hier voor het geval anderen dit probleem meer hebben.
Specifieke oplossing was om de directory include/
van de Conda-omgeving op te nemen in de CFLAGS
, namelijk:
CFLAGS="-I${CONDA_PREFIX}/include"
Opmerking, ik moest ook -lstdc++ -Wl,-rpath ${CONDA_PREFIX}/lib -L${CONDA_PREFIX}/lib
bij koppelen, vergelijkbaar met Dit GitHub-probleem .