Schakel OpenMP-ondersteuning in in clang in Mac OS X (sierra & Mojave)

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.cuitvoerde, kreeg ik de volgende foutmelding:

clang: error: unsupported option '-fopenmp'

Het lijkt erop dat clang de vlag -fopenmpniet 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 CPPFLAGSinstellen 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/includemet

open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

Update 2:Het voorbeeldbestand omp_hello.clijkt 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.cdoor clang -Xpreprocessor -fopenmp test.c -lomp.


Antwoord 3, autoriteit 31%

MacOS Mojave met CMake

  1. Installeer LLVM met openmp en libomp met brew

    brew update
     brew install llvm libomp
    
  2. 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")
    
  3. 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-openmpen de -fopenmpvlag 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}/libbij koppelen, vergelijkbaar met Dit GitHub-probleem .

Other episodes