第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 月号
© Copyright 2025 ExpyDoc