MacやFreeBSDのデフォルトのコンパイラはclangだが,数値計算ではOpenMPが使えるgccに一日の長がある。ClangでもOpenMPはないのかと思い検索したところ,OpenMP/Clangがあることを知り,試してみた。

コンパイラ

OpenMP/ClangのGetting the source codeの通りにソースを取得。同BuildingにあるようにClangのGetting Started Building and Running Clangに従ってコンパイル。llvmとclangをコンパイルするので時間がかかるが,Mavericksでは何の問題もなく終了した。buildというディレクトリからconfigureとmakeをすると,build/Debug+Asserts以下にbinとlibができる。

実行時ライブラリ

次にIntelのOpenMP Runtime Libraryをダウンロード。clangでのビルドに対応しているが,gccを探してバージョンを調べるところでコンパイルが止まってしまう。tools/check-tools.plを編集する。単純に変数$verと$bldを指定した。

--- tools/check-tools.pl.orig	2013-12-14 03:08:50.000000000 +0900
+++ tools/check-tools.pl	2014-07-05 16:19:31.000000000 +0900
@@ -276,8 +276,10 @@
             # i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367)
             # i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5484)
             # i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.9.00)
-            $stdout =~ m{^.*? \(GCC\) (\d+\.\d+\.\d+) \(.*Apple.*?Inc\. build (\d+)\)}m;
-            ( $ver, $bld ) = ( $1, $2 );
+#            $stdout =~ m{^.*? \(GCC\) (\d+\.\d+\.\d+) \(.*Apple.*?Inc\. build (\d+)\)}m;
+#            ( $ver, $bld ) = ( $1, $2 );
+            $ver = "4.8.2";
+            $bld = "2";
         } else {
             if ( 0 ) {
             } elsif ( $stdout =~ m{^.*? \(GCC\) (\d+\.\d+\.\d+)(?: (\d+))?}m ) {

ちなみにgccはMacPortsのgcc48だが,

$ sudo port select gcc mp-gcc48

としてあるので,一応/opt/local/bin/gccがある。

もうひとつsrc/makefile.mkで余計なld-flagsをコメントアウトする必要がある。

--- src/makefile.mk.orig	2013-12-14 03:08:48.000000000 +0900
+++ src/makefile.mk	2014-07-05 16:10:20.000000000 +0900
@@ -430,7 +430,7 @@
 endif
 
 ifeq "$(os)" "mac"
-    ld-flags += -no-intel-extensions
+#    ld-flags += -no-intel-extensions
     ld-flags += -single_module
     ld-flags += -current_version $(VERSION).0 -compatibility_version $(VERSION).0
 endif
$ make compiler=clang

とするとtmpの下でコンパイルが実行され,tmp/mac_32e…/libiomp5.dylibができる。ヘッダはexports/common/includeにコピーされる。ライブラリは,exports/libというディレクトリを作りコピーした。

環境変数の設定

OpenMP/ClangのUsingに従って環境変数を設定する。