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に従って環境変数を設定する。