並列アルゴリズムライブラリ
Thrust について
@krustf
Boost.勉強会 #13 仙台
2013/10/19

1
自己紹介

• @krustf
• 現在 B4 で来年からつくば
• GPGPU とか MPI とかのあたり
• 卒論終わった (Appendix B 以外)
2
言い訳

• 先週は高校の同窓会と計算シミュレー
ション勉強会の発表と大学の OB 会

• 昨日は 19 - 23 時ぐらいまで飲み会
• つい1時間前まで学会の最終版投稿〆切
• 時間がない
3
GPGPU

• 流行の GPU に汎用計算させるあれ
• GPU クラスタも世界的に用いられる

4
MIC (Xeon Phi)

• Intel がリリースした x86_64 動作のコプ
ロセッサ

• MIC が単独でプログラムを実行可能な
ところが GPU と大きく異なる

5
GPU と MIC

• TOP500 June 2013 では
1位: 天河2号 (MIC) Rpeak 54 PFLOPS
2位: Titan (GPU) Rpeak 27 PFLOPS
3位: Sequoia (BlueGene/Q) R...
GPU と MIC の問題

• GPU は元のプログラムに大幅な修正を
入れなければいけない

• MIC は元のプログラムに手を加えずと
も動くがパフォーマンスが悪い

• 最終的にどちらもチューニングが必要
7
API とか

• GPU といっても
• CUDA (NVIDIA)
• OpenCL (NVIDIA/AMD)
• OpenACC
• DirectCompute (DirectX11)
• 等いろいろあるのでとてもつらい
8
OpenCL

• GPU だけでなく複数のアクセラレータ
で使用できる

• Heterogeneous Computing
• 一般的なアプリケーションでの並列コ
ンピューティングの提供

9
OpenACC

• OpenMP と同じ pragma directive
• GPU よりだが,MIC も扱える
• OpenACC が使用できる PGI コンパイラ
の開発会社の PGI は NVIDIA の子会社

10
プログラミングモデル

• GPGPU はプログラミングが難解
• 面倒とも呼ぶ (かも)
• OpenCL も結構面倒と認識
11
STL 風ライブラリ

• 最近は STL 風ライブラリが並列プログ
ラミングでは実装されている

• Bolt C++ Template Library (OpenCL)
• Intel TBB
• Thrust (CUDA)
12
Bolt C++ Template Library

• OpenCL ベースの STL 風ライブラリ
• ただし AMD GPU でないと動かないに
加えて VS2010 が必要

• Windows も AMD GPU も VS2010 も...
Intel TBB

• CPU 並列の STL 風ライブラリ
• 前回の Boost.勉強会 #11 東京 で紹介済

14
Thrust

• CUDA の STL 風ライブラリ
• OpenMP, TBB をバックエンドに変更可
能なので CUDA だけという訳ではない

• 今回のメイン
15
Thrust の使用

• CUDA SDK に標準でインストール
• バージョンはまちまち
• 最新版は version 1.7.0
• ヘッダオンリーなのでライブラリのリ
ンクは不要
16
Thrust が使われているライブラリ

• Boost.ODEint
• 常微分方程式の解法
• MATLAB
• 有名な数値解析ソフトウェア
17
Host と Device

• CUDA では Host と Device という名前で
CPU と GPU を区別している

• Host : CPU
• Device : GPU
• Thrust も上記の名称を踏襲している
18
Host-Device 間データ通信

• CUDA の Host/Device はメモリ空間を共
有していないので,データ通信が必要

• Thrust でも同じ
19
サンプル
#include
#include
#include
#include
#include
#include

<thrust/host_vector.h>
<thrust/device_vector.h>
<thrust/sequen...
ビルド方法

• CUDA 標準インストールの Thrust を用
いる場合

• nvcc => CUDA 用コンパイラ
$ nvcc -o thrust.run main.cu

• CUDA 標準インストールの Thrust は
/usr...
ソースを落とす場合

• /usr/local/cuda/include 以外にインストー
ルしてインクルードパスを通す

• http://thrust.github.io
22
Thrust の特徴

• STL アルゴリズムをそのまま CUDA に
持ち込むと効率が悪いので専用の関数
等が用意されている

• C++11 Lambda は使えないが,Thrust 用
Placeholder が定義されている

23
Functor の定義
template<class T>
struct axpy_functor {
const T a;
axpy_functor(T _a) : a(_a) {}
__host__
__device__
T operato...
修飾子

• __host__
• CUDA の Host 関数
• __device__
• CUDA の Device 関数
• 両方一緒に定義可能
25
OpenMP と TBB バックエンド

• Thrust は CUDA だけでなく OpenMP と
TBB をバックエンドにできる

• CUDA を動かせない or CUDA よりも
CPU で処理した方が良い部分も Thrust
で計算...
ビルド時の設定

• 実行方法をプログラム全体で指定
• OpenMP
$ nvcc -o thrust.run main.cu 
-DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_OMP 
-fopenm...
g++, icpc 等でビルド

• OpenMP, TBB で Thrust を使用する際に
は nvcc ではなく g++ などの C++ コンパ
イラでビルド可能

• CUDA がない環境でも動かせる
28
コード中で個別指定
#include
#include
#include
#include
#include

<thrust/omp/vector.h>
<thrust/sequence.h>
<thrust/transform.h>
<th...
実行ポリシーで指定
#include
#include
#include
#include
#include

<thrust/system/omp/execution_policy.h>
<thrust/system/tbb/executio...
Fancy Iterator

• zip_iterator
• タプルのイテレータ
• transform_iterator
• functor を適用しながら進める
• permutation_iterator
• parallel pat...
実装済みアルゴリズム

• searching
• copying (gather, scatter)
• reduction
• merging
• reordering
32

• prefix sums
• sorting
• trans...
よくわからなかったところ

• 使用する vector が複数あるときは?
• zip_iterator でタプルにするのが楽
• vector size が同じでない場合は?

33
思うところ

• 恐らく並列処理はソフトウェア (つまり
プログラミング) が容易になってくると
考えられる

• 記述やチューニングの容易さ
• それをサポートするのが TBB や Thrust,
Bolt と言ったライブラリと考えられる

...
質疑

• なにかあれば

35
Upcoming SlideShare
Loading in...5
×

Thrust

1,675

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,675
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
15
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

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
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×