More Related Content
Similar to 並列化による高速化 (20)
並列化による高速化
- 5. どのくらい速くなるのか?
サンプル:
π(の近似値)を数値積
分で求める
(積分範囲を分割した長方形の高さ
をそれぞれ求め合計したものと、
長方形の幅を掛ける)
逐次プログラム
static long num_rects = 100000000;
(今回は一億個に分割する)
int main(){
double area;
double mid,height,width,sum=0.0;
int i;
width=1.0/(double)num_rects;
for(i=0;i<num_rects;i++){
mid=(i+0.5)*width;
height=4.0/(1.+mid*mid);
sum+=height;
}
area= width*sum;
printf(“πの値%fn",area);
return 0;
}
- 6. どのくらい速くなるのか?
サンプル:
π(の近似値)を数値積
分で求める
(積分範囲を分割した長方形の高さ
をそれぞれ求め合計したものと、
長方形の幅を掛ける)
static long num_rects = 100000000;
(今回は一億個に分割する)
int main(){
double area;
double mid,height,width,sum=0.0;
int i;
width=1.0/(double)num_rects;
#pragma omp parallel for private(mid,height) reduction(+:sum)
for(i=0;i<num_rects;i++){
mid=(i+0.5)*width;
height=4.0/(1.+mid*mid);
sum+=height;
}
area= width*sum;
printf(“πの値%fn",area);
return 0;
}
OpenMPを用いて並列化
omp_set_num_threads()で
使用するスレッド数を変えて
繰り返し実行
それぞれの処理速度等を出力する
(コード省略)
並行プログラム
- 25. 1.再帰的
4 0 2 7 6 9 3 1 5 8
1 0 2 3 4 7 6 9 5 8
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
- 26. 1.再帰的
スレッドを作る
4 0 2 7 6 9 3 1 5 8
1 0 2 3 4 7 6 9 5 8
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
- 27. 1.再帰的
スレッドを作る
4 0 2 7 6 9 3 1 5 8
スレッドを作る
1 0 2 3 4 7 6 9 5 8
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
- 28. 1.再帰的
スレッドを作る
4 0 2 7 6 9 3 1 5 8
スレッドを作る
1 0 2 3 4 7 6 9 5 8
スレッドを作る
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
- 29. 1.再帰的
スレッドを作る
4 0 2 7 6 9 3 1 5 8
スレッドを作る
1 0 2 3 4 7 6 9 5 8
スレッドを作るスレッドを作る
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
- 30. 1.再帰的
スレッドを作る
4 0 2 7 6 9 3 1 5 8
スレッドを作る
1 0 2 3 4 7 6 9 5 8
スレッドを作るスレッドを作る
0 1 2 3 4 5 6 7 8 9
スレッドを作る
0 1 2 3 4 5 6 7 8 9
- 31. 1.再帰的
スレッドを作る
4 0 2 7 6 9 3 1 5 8
スレッドを作る
スレッドを作る
1 0 2 3 4 7 6 9 5 8
スレッドを作るスレッドを作るスレッドを作るスレッドを作る
0 1 2 3 4 5 6 7 8 9
スレッドを作るスレッドを作るスレッドを作る
0 1 2 3 4 5 6 7 8 9
- 35. 2.繰り返し
パーティションごとの基本操作
4 0 2 7 6 9 3 1 5 8
調べる
大きい
パーティション
小さい
入れ替え
ピボットより
逐次プログラム
キュー
パーティションの範囲のデータ
キューが空になるまで繰り返す
- 36. 2.繰り返し
パーティションごとの基本操作
4 0 2 7 6 9 3 1 5 8
調べる
大きい
パーティション
小さい
入れ替え
ピボットより
逐次プログラム
キュー
パーティションの範囲のデータ
キューが空になるまで繰り返す
並列化してみる
- 58. 2.繰り返しー処理の終了
キュー
スレッドスレッドスレッド
スレッド
スレッド内の処理中
・パーティションの要素数が1になった時
・ピボットでの分割時
ある1要素が正しい位置になる
共有カウンタ
全てのソートが終わると
共用カウンタの値が要素数
と等しくなる
同期オブジェクト
Qの要素数を表す正のカウンタ
- 59. 2.繰り返しー処理の終了
キュー
スレッド数を加算
スレッドスレッドスレッド
スレッド
スレッド内の処理中
・パーティションの要素数が1になった時
・ピボットでの分割時
ある1要素が正しい位置になる
共有カウンタ
全てのソートが終わると
共用カウンタの値が要素数
と等しくなる
同期オブジェクト
Qの要素数を表す正のカウンタ
- 60. 2.繰り返しー処理の終了
キュー
スレッド数を加算
スレッドスレッドスレッド
スレッド
スレッド内の処理中
・パーティションの要素数が1になった時
・ピボットでの分割時
ある1要素が正しい位置になる
共有カウンタ
全てのソートが終わると
共用カウンタの値が要素数
と等しくなる
同期オブジェクト
Qの要素数を表す正のカウンタ
参照&
Break文で脱出
- 63. 並列化してできるだけ速くするには
並列実行可能時間の割合を上げる
実行時間を長く費やしているところから並列
化する場所を検討する
並行性は実現可能な最上位で実装する
スレッドごとの処理量を均等にする
オーバーヘッドを減らす
同期処理を減らす
スレッド作成や共有データへのアクセスは必
要だが、できるだけ少なくする