Mac で AVX + マルチスレッドを試してみる - その1 -
久々に Intel AVX の記事です
久々に Intel AVX の記事です.Intel AVX の概要や簡単な説明は過去の記事をご確認ください.
Intel AVX を使用して SIMD 演算を試してみる - kawa0810 のブログ
第2回闇鍋プログラミング勉強会で発表してきました - kawa0810 のブログ
Mac で Intel AVX + マルチスレッドを考える
Mac で Intel AVX を使うためには「gcc や g++ でアセンブラを生成」し,「生成したアセンブラを clang でコンパイル」する必要があります.つまり,コンパイルは次のようになります.
$ g++-mp-4.7 main.cpp -S -mavx $ clang++-mp-3.2 main.s
以前,マルチスレッドプログラミングで「Pthread」,「std::async」,「Win32 API *1」,「OpenMP」を紹介しました.Mac で Intel AVX + マルチスレッドを行う場合は上述の通り,「gcc や g++ でアセンブラを生成」し「生成したアセンブラを clang でコンパイル」する必要があるため,コンパイルできない・実行時エラーになる等の問題が発生しないか確認します.※ ただし,今回は Mac 環境を対象とするので「Win32 API」は除外します.
検証環境
今回の検証環境は次の通りです.
- マシン:MBP (型不明・・・)
- OS:OSX 10.8.2
- GCC:g++-mp-4.7.2
- clang:clang++-mp-3.2 (tag/RELEASE_32/final)
- CPU:2.7GHz Intel Core i7 (Sandy Bridge)
OpenMP 編
・ソースコード:マルチスレッドプログラミングで総和計算 - その4 OpenMP 編- - kawa0810 のブログ
・コンパイル方法:
$ g++-mp-4.7 openmp_sum.cpp -S -fopenmp $ clang++-mp-3.2 openmp_sum.s
・結果:コンパイル不可能
g++ は通るが clang++ でコンパイルエラーとなる
Undefined symbols for architecture x86_64: "_GOMP_parallel_end", referenced from: float vec_sum<float>(unsigned long, float const*) in openmp_sum-PSOCC6.o double vec_sum<double>(unsigned long, double const*) in openmp_sum-PSOCC6.o <以下略>
std::async 編
・ソースコード:マルチスレッドプログラミングで総和計算 - その2 std::thread & std::async 編- - kawa0810 のブログ
・コンパイル方法
$ g++-mp-4.7 async_sum.cpp -S -std=c++11 $ clang++-mp-3.2 async_sum.s -std=c++11
・結果:コンパイル不可能
g++ は通るが clang++ でコンパイルエラーとなる
Undefined symbols for architecture x86_64: "std::__future_base::_State_base::~_State_base()", referenced from: std::__future_base::_Async_state_common::~_Async_state_common() in async_sum-46dJpn.o std::__future_base::_Async_state_common::~_Async_state_common() in async_sum-46dJpn.o <以下略>
Pthread 編
・ソースコード:マルチスレッドプログラミングで総和計算 - その1 Pthread 編- - kawa0810 のブログ
・コンパイル方法
$ g++-mp-4.7 pthread_sum.cpp -S -pthread $ clang++-mp-3.2 pthread_sum.s -pthread
・結果:コンパイル・実行可能