Mac で AVX + マルチスレッドを試してみる - その1 -

久々に Intel AVX の記事です

 久々に Intel AVX の記事です.Intel AVX の概要や簡単な説明は過去の記事をご確認ください.
Intel AVX を使用して SIMD 演算を試してみる - kawa0810 のブログ
第2回闇鍋プログラミング勉強会で発表してきました - kawa0810 のブログ

MacIntel AVX + マルチスレッドを考える

 MacIntel 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」を紹介しました.MacIntel 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

・結果:コンパイル・実行可能

まとめ

現状,MacIntel AVX + マルチスレッドをやるためには Pthread しか選択肢がなさそう.OpenMP と std::async が駄目な理由は今度調査します.