2013-02-28 18 views
7

Ich habe gerade auf OS X 10.8 "Mountain Lion" aktualisiert und ich bereute, dass ich das getan habe.OS X 10.8, llvm, OpenMP mit CMake

Ich bin nicht mehr in der Lage, meinen (einfachen) parallelen Code zu erstellen, der OpenMP verwendet.

Durch den Blick hier und da habe ich verstanden, dass Apple nicht mehr 'gcc', sondern 'llvm' verwendet - sehr wahrscheinlich aufgrund von Lizenzproblemen. Leider unterstützt 'llvm' (noch?) Nicht OpenMP.

Ich kann nicht glauben, dass viele auf OpenMP basierende Programme unter OS X nicht mehr laufen werden. Meine Frage ist also: Wie kann ich OpenMP in Mountain Lion aktivieren?

Nachdem ich die ausgezeichnete Antwort von Hristo Iliev gelesen habe, glaube ich, dass ich mehr vermisse, als ich ursprünglich dachte.

Ich verwende keinen XCode. Das Gebäude basiert auf CMake und make/gcc. Gestern habe ich gcc 4.2 über Macports installiert, aber - wie heute - ist mein Code immer noch in Quellform, weil ich aus irgendwelchen Gründen die Kompilierung nicht auf gcc umstellen kann (gleiche Fehler wie bei OpenMP).

Das Problem besteht nun darin, dass CMake den llvm-Compiler verwendet. In der Wurzel CMakeLists.txt habe ich die folgenden zwei Zeilen:

set(CMAKE_C_COMPILER "/opt/local/bin/gcc-apple-4.2") 
set(CMAKE_CXX_COMPILER "/opt/local/bin/gcc-apple-4.2") 

und habe ich auch noch zwei Variablen Umgebungen:

export CXX=/opt/local/bin/gcc-apple-4.2 
export CC=/opt/local/bin/gcc-apple-4.2 

Wenn CMake versucht OpenMP (FIND_PACKAGE (OpenMP)) Ich zu finden bekommen die folgende Ausgabe:

-- The compiler is /opt/local/bin/gcc-apple-4.2 
-- Try OpenMP C flag = [-fopenmp] 
-- Performing Test OpenMP_FLAG_DETECTED 
-- Performing Test OpenMP_FLAG_DETECTED - Failed 
[...] 
CMake Error at /opt/local/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:97 (message): 
Could NOT find OpenMP (missing: OpenMP_C_FLAGS OpenMP_CXX_FLAGS) 
Call Stack (most recent call first): 
/opt/local/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:291 (_FPHSA_FAILURE_MESSAGE) 
/opt/local/share/cmake-2.8/Modules/FindOpenMP.cmake:159 (find_package_handle_standard_args) 
demo/CMakeLists.txt:8 (FIND_PACKAGE) 

ich versuchte /opt/local/bin/gcc-apple-4.2 manuell ausführen und es scheitert aufgrund eines fehlenden libgomp.

Grüße

+1

Sie können einfach gcc auf 10.8 installieren: http://StackOverflow.com/questions/9353444/how-to-use-install-gcc-on-mac-os-x-10-8-xcode-4-4 –

+1

Ich habe diese Frage gefunden, aber es war mit der Installation von Befehlszeilentools verbunden. Jetzt habe ich die Antwort auf die Installation des echten gcc gesehen. Vielen Dank. –

+0

Sie mussten GCC 4.2 nicht von Macports hinzufügen, da es mit den XCode-Befehlszeilenwerkzeugen geliefert wird. Sie müssen nur [zusätzlich über die GUI installieren] (http://developer.apple.com/library/ios/#documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles/xcode_4_3.html). Da Sie XCode jedoch nicht verwenden, würde ich Ihnen wärmstens empfehlen, Ihr eigenes GCC 4.7.2 zu erstellen - das Neueste und das Größte mit Unterstützung für OpenMP 3.1-Funktionen :) –

Antwort

11

LLVM ist ein Compiler-Framework, das Apple-extensiv in OS X (vor allem in der OpenGL-Implementierung) verwendet, kein Compiler selbst. Es gibt zwei LLVM-Frontends in Xcode - die alte GCC-basierte llvm-gcc (die OpenMP 2.5 unterstützt) und die neue clang (die OpenMP nicht unterstützt). clang verfügt über umfangreiche statische Code-Analyse-Funktionen und auch viel bessere Fehlerberichte, insbesondere mit C++ - Code. Meistens ist das der Grund, warum Apple in das Unternehmen investiert und sich von GCC entfernt (das FreeBSD-Projekt versucht andererseits, GCC aus rein lizenzfreien Gründen durch Klänge zu ersetzen). Es gibt ein laufendes Projekt clomp (nicht zu verwechseln mit Intels Cluster OpenMP), das versucht eine OpenMP-fähige Version von clang zu erstellen, aber es ist noch lange nicht ausgereift.

Wenn Sie keine neuen OpenMP-Konstrukte wie explizite Aufgaben benötigen und mit einigen bugs leben können, können Sie weiterhin das alte GCC-Frontend verwenden. Schalten Sie einfach den Compiler-Suite in den Projekteinstellungen auf LLVM GCC 4.2:

Compiler suite chooser

Dieses basiert auf der wirklich alten GCC 4.2.1 und scheint nicht mehr entwickelt werden. Sollten Sie eine neuere Version von GCC benötigen, einfach build one. Leider kann ich Ihnen keine Informationen zur Integration in Xcode geben. Es funktioniert für mich auf der Kommandozeile mit GCC 4.7.1 und OS X 10.8.2 (und ich verwende Xcode nicht viel).

4

Nur ein paar Worte zur ausgezeichneten Antwort von Hristo hinzufügen: Sie können gcc über MacPorts installieren. Dies ist viel einfacher, als alles mit den Händen zu kompilieren (und das Kompilieren von gcc von Grund auf neu ist, kann aufgrund von Abhängigkeiten usw. eine wirklich nicht-triviale Aufgabe sein).

Installieren Sie also MacPorts, machen Sie "sudo port install gcc47", warten Sie einige Stunden und Sie werden mit gcc-mp-4.7 enden, das Ihren OpenMP-Code kompilieren kann.

+3

Es ist auch in Homebrew erhältlich. – FreeNickname

+6

für die OpenMP-Unterstützung verwenden Sie '$ brew install gcc --without-multilib' –