ラズパイ 並列プログラミング入門

第3部
第
8章
ご購入はこちら
コア並列とノード並列ハイブリッドで性能 UP!
ラズパイ
並列プログラミング入門
山際 伸一
・複数のプロセスを立ち上げ,ファイルを介して共
リスト 1 行列の各要素の平均値を求めるプログラム(逐次処理)
#define N 1000
#define M 1000
有するデータを交換する
sum = 0.0;
for (i=0;i<N;i++)
for (j=0;j<M;j++)
sum += a[i][j];
int main(){
int i, j;
double a[N][M];
double sum;
・
複数のスレッドをプロセス内で起動し,同じ変数
を介して共有するデータを交換する
しかし,これらのプログラムの構成を考えるととて
も複雑です.
sum /= N*M;
}
● 行列を複数のスレッドで共有しながら並列計算
する
行列 a を複数のスレッドで共有しながら,並列に計
ここでは行列の各要素の平均値を求めるプログラム
を考えながら,並列プログラミングについて説明しま
す.第 7 章で説明した環境を構築している方は,ぜひ
試してみてください.
単純に,行列の各要素の平均値を計算するプログラ
ムリスト 1 に示します.
算するようにこのプログラムを変形してみます.例え
ば図 1 のように,行列をスレッド数ぶんのブロックに
分け,そのブロック内の合計値を求め,もう一つの共
有している変数である sum に担当する部分を書き込
んで,最後に sum の全ての要素の合計と平均を計算
します.
スレッドを使って並列化した場合,リスト 2 のよう
な構造になります.
N_THREAD にスレッド数を指定します.
自力で並列化は簡単じゃない
共有メモリ方式のプログラムを実装しようと思う
と,例えば以下の方法があります.
A
B
行列A
C
D
ステップ1:配列の部分を
各プロセッサに割り当てる
スレッド1
Aの合計を求める計算
スレッド2
スレッド3
Bの合計を求める計算
Cの合計を求める計算
スレッド4
Dの合計を求める計算
ステップ2:配列の部分を受け取り,部分合計を求める
ステップ3:部分合計をあるプロセッサに
集めて,全体の合計を求める
配列sum
total_sum
部分合計の合計を求める
図 1 行列をスレッド数分のブロックに分けて計算する
86
2016 年 11 月号