Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Thrust

3,621 views

Published on

Published in: Technology
  • Be the first to comment

Thrust

  1. 1. 並列アルゴリズムライブラリ Thrust について @krustf Boost.勉強会 #13 仙台 2013/10/19 1
  2. 2. 自己紹介 • @krustf • 現在 B4 で来年からつくば • GPGPU とか MPI とかのあたり • 卒論終わった (Appendix B 以外) 2
  3. 3. 言い訳 • 先週は高校の同窓会と計算シミュレー ション勉強会の発表と大学の OB 会 • 昨日は 19 - 23 時ぐらいまで飲み会 • つい1時間前まで学会の最終版投稿〆切 • 時間がない 3
  4. 4. GPGPU • 流行の GPU に汎用計算させるあれ • GPU クラスタも世界的に用いられる 4
  5. 5. MIC (Xeon Phi) • Intel がリリースした x86_64 動作のコプ ロセッサ • MIC が単独でプログラムを実行可能な ところが GPU と大きく異なる 5
  6. 6. GPU と MIC • TOP500 June 2013 では 1位: 天河2号 (MIC) Rpeak 54 PFLOPS 2位: Titan (GPU) Rpeak 27 PFLOPS 3位: Sequoia (BlueGene/Q) Rpeak 20PFLOPS 4位: 京 (SPARC64) Rpeak 11 PFLOPS (Rpeak = Theoretical Peak.) 6
  7. 7. GPU と MIC の問題 • GPU は元のプログラムに大幅な修正を 入れなければいけない • MIC は元のプログラムに手を加えずと も動くがパフォーマンスが悪い • 最終的にどちらもチューニングが必要 7
  8. 8. API とか • GPU といっても • CUDA (NVIDIA) • OpenCL (NVIDIA/AMD) • OpenACC • DirectCompute (DirectX11) • 等いろいろあるのでとてもつらい 8
  9. 9. OpenCL • GPU だけでなく複数のアクセラレータ で使用できる • Heterogeneous Computing • 一般的なアプリケーションでの並列コ ンピューティングの提供 9
  10. 10. OpenACC • OpenMP と同じ pragma directive • GPU よりだが,MIC も扱える • OpenACC が使用できる PGI コンパイラ の開発会社の PGI は NVIDIA の子会社 10
  11. 11. プログラミングモデル • GPGPU はプログラミングが難解 • 面倒とも呼ぶ (かも) • OpenCL も結構面倒と認識 11
  12. 12. STL 風ライブラリ • 最近は STL 風ライブラリが並列プログ ラミングでは実装されている • Bolt C++ Template Library (OpenCL) • Intel TBB • Thrust (CUDA) 12
  13. 13. Bolt C++ Template Library • OpenCL ベースの STL 風ライブラリ • ただし AMD GPU でないと動かないに 加えて VS2010 が必要 • Windows も AMD GPU も VS2010 もな いのでパス 13
  14. 14. Intel TBB • CPU 並列の STL 風ライブラリ • 前回の Boost.勉強会 #11 東京 で紹介済 14
  15. 15. Thrust • CUDA の STL 風ライブラリ • OpenMP, TBB をバックエンドに変更可 能なので CUDA だけという訳ではない • 今回のメイン 15
  16. 16. Thrust の使用 • CUDA SDK に標準でインストール • バージョンはまちまち • 最新版は version 1.7.0 • ヘッダオンリーなのでライブラリのリ ンクは不要 16
  17. 17. Thrust が使われているライブラリ • Boost.ODEint • 常微分方程式の解法 • MATLAB • 有名な数値解析ソフトウェア 17
  18. 18. Host と Device • CUDA では Host と Device という名前で CPU と GPU を区別している • Host : CPU • Device : GPU • Thrust も上記の名称を踏襲している 18
  19. 19. Host-Device 間データ通信 • CUDA の Host/Device はメモリ空間を共 有していないので,データ通信が必要 • Thrust でも同じ 19
  20. 20. サンプル #include #include #include #include #include #include <thrust/host_vector.h> <thrust/device_vector.h> <thrust/sequence.h> <thrust/transform.h> <thrust/functional.h> <iostream> int main(int argc, char** argv) {   static const int n = 10;   thrust::device_vector<double> x(n), y(n);   // initialize x to 0,1,2,3...   thrust::sequence(x.begin(), x.end());   // compute y = 2x   using namespace thrust::placeholders;   thrust::transform(x.begin(), x.end(), y.begin(), 2 * _1);   // print y   thrust::copy(y.begin(), y.end() , std::ostream_iterator<double>(std::cout, " ")); } > 0 2 4 6 8 10 12 14 ....... 20
  21. 21. ビルド方法 • CUDA 標準インストールの Thrust を用 いる場合 • nvcc => CUDA 用コンパイラ $ nvcc -o thrust.run main.cu • CUDA 標準インストールの Thrust は /usr/local/cuda/include にあるが,-I や CPLUS_INCLUDE_PATH 等でインクル ードパスを指定しないこと 21
  22. 22. ソースを落とす場合 • /usr/local/cuda/include 以外にインストー ルしてインクルードパスを通す • http://thrust.github.io 22
  23. 23. Thrust の特徴 • STL アルゴリズムをそのまま CUDA に 持ち込むと効率が悪いので専用の関数 等が用意されている • C++11 Lambda は使えないが,Thrust 用 Placeholder が定義されている 23
  24. 24. Functor の定義 template<class T> struct axpy_functor { const T a; axpy_functor(T _a) : a(_a) {} __host__ __device__ T operator()(T const& x, T const& y) const { return a * x + y; } }; static const int n = 10; thrust::device_vector<double> x(n), y(n); // initialize... thrust::transform(x.begin(), x.end() , y.begin(), axpy_functor<double>()); 24
  25. 25. 修飾子 • __host__ • CUDA の Host 関数 • __device__ • CUDA の Device 関数 • 両方一緒に定義可能 25
  26. 26. OpenMP と TBB バックエンド • Thrust は CUDA だけでなく OpenMP と TBB をバックエンドにできる • CUDA を動かせない or CUDA よりも CPU で処理した方が良い部分も Thrust で計算できるので効率が良い 26
  27. 27. ビルド時の設定 • 実行方法をプログラム全体で指定 • OpenMP $ nvcc -o thrust.run main.cu -DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_OMP -fopenmp • TBB $ nvcc -o thrust.run main.cu -DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_TBB -ltbb 27
  28. 28. g++, icpc 等でビルド • OpenMP, TBB で Thrust を使用する際に は nvcc ではなく g++ などの C++ コンパ イラでビルド可能 • CUDA がない環境でも動かせる 28
  29. 29. コード中で個別指定 #include #include #include #include #include <thrust/omp/vector.h> <thrust/sequence.h> <thrust/transform.h> <thrust/functional.h> <iostream> int main(int argc, char** argv) {   static const int n = 10;   thrust::omp::vector<double> x(n), y(n);   // initialize x to 0,1,2,3... (by OpenMP)   thrust::sequence(x.begin(), x.end());   // compute y = 2x (by OpenMP)   using namespace thrust::placeholders;   thrust::transform(x.begin(), x.end(), y.begin(), 2 * _1);   // print y   thrust::copy(y.begin(), y.end() , std::ostream_iterator<double>(std::cout, " ")); } 29
  30. 30. 実行ポリシーで指定 #include #include #include #include #include <thrust/system/omp/execution_policy.h> <thrust/system/tbb/execution_policy.h> <thrust/transform.h> <vector> <iostream> int main(int argc, char** argv) {   static const int n = 10; std::vector<double> x(n), y(n);   // initialize x to 0,1,2,3... (by OpenMP)   thrust::sequence(thrust::omp::par, x.begin(), x.end());   // compute y = 2x (by TBB)   using namespace thrust::placeholders;   thrust::transform(thrust::tbb::par , x.begin(), x.end(), y.begin(), 2 * _1);   // print y   thrust::copy(y.begin(), y.end() , std::ostream_iterator<double>(std::cout, " ")); } 30
  31. 31. Fancy Iterator • zip_iterator • タプルのイテレータ • transform_iterator • functor を適用しながら進める • permutation_iterator • parallel pattern の mapとか 31
  32. 32. 実装済みアルゴリズム • searching • copying (gather, scatter) • reduction • merging • reordering 32 • prefix sums • sorting • transform • random
  33. 33. よくわからなかったところ • 使用する vector が複数あるときは? • zip_iterator でタプルにするのが楽 • vector size が同じでない場合は? 33
  34. 34. 思うところ • 恐らく並列処理はソフトウェア (つまり プログラミング) が容易になってくると 考えられる • 記述やチューニングの容易さ • それをサポートするのが TBB や Thrust, Bolt と言ったライブラリと考えられる 34
  35. 35. 質疑 • なにかあれば 35

×