理学部情報科学科

メニュー

マルチコアプロセッサで並列処理(3/4)

3.並列処理ソフトウェア

 マルチコアプロセッサを使うためのソフトウェアとはどのようなものか考えてみましょう。プログラミング言語は、従来よりC/C++言語、Java言語などが普及しています。このようなプログラミング言語で並列プログラムを作成する場合、プログラムのどの部分に並列処理を適用するか、プログラム中に指示文(後述のOpenMP)として記述することが必要となります。即ち、並列処理に関する記述を行わないと、マルチコアプロセッサ上で実行しても、1コアしか使用されないため、高速化を実現することができない訳です。
 複数のプロセッサコアを使って、計算処理を分散して並列実行するためには、C/C++言語においてOpenMPと呼ばれる並列化API(Application Programming Interaface)を用いたり、Java言語のようにプログラミング言語に用意されているマルチスレッド命令を使う必要があります。ここでは、並列処理の記述が比較的容易なOpenMPによる並列プログラミングを紹介します。
 OpenMPは、OpenMPフォーラムによって提唱された共有メモリ型並列プログラミングの標準APIです。OpenMPは既存のC/C++言語などと組み合わせて使います。C/C++言語のプログラムにおいて並列処理を行う場合、簡単な指示文(並列処理適用部分を明示する文)をプログラム中に埋め込み、OpenMP対応のコンパイラでコンパイル(翻訳)すると並列機械語プログラムを生成することができます。

3.1 ループ並列処理

 一般的なプログラムにおいて効果の大きい並列処理手法は、ループ並列処理(Doall処理)と呼ばれるものです。ループ並列処理では、複数回の繰返し処理が行われるので、各繰返し処理(イタレーション)を、複数のコアに分散して実行することにより、コア数に応じた性能向上を達成することができます。
 例えば、2.で紹介した簡単な計算例(前半の処理)をOpenMPで記述すると図5(上部)のようなプログラムになります。以下のプログラムでは、a[i] = i*i;の計算をi=1~8の間、繰り返すものです。この場合、デュアルコアプロセッサでは、OpenMPの指示文(#pragma omp parallel for)を記述すると、i=1~4がコア0に割り当てられ、i=5~8がコア1に割り当てれるので、2倍の速度向上を達成することが可能になります。
3.1 ループ並列処理

3.2 リダクション処理

 上述のループ並列処理と並んでよく使われる並列処理手法は、リダクション処理と呼ばれるものです。リダクション処理では、総和計算を複数のプロセッサコアに分散して実行することにより、プロセッサコア数に応じた性能向上を達成することができます。
 例えば、2.で紹介した簡単な計算例(後半の処理)をOpenMPで記述すると図5(下部)のようなプログラムになります。以下のプログラムでは、total += a[i];の計算をi=1~8の間、繰り返すものです。この場合、デュアルコアプロセッサでは、OpenMPの指示文(#pragma omp parallel for reduction(+:total))を記述すると、i=1~4がコア0に割り当てられ、i=5~8がコア1に割り当てれるので、2倍の速度向上を達成することが可能になります。

3.3 タスク並列処理

 ループ並列処理は1つの繰返し文をコアに分散して並列処理する方法でしたが、タスク並列処理では、各プロセッサコアで独立したタスク(プログラムの一部分)を並列に処理することが可能になります。例えば、図6のプログラムでは、OpenMPの指示文(#pragram omp parallel sections)を記述することにより、コア0の計算処理とコア1の計算処理を別々のコア上で並列実行できるため、速度向上が期待できます。一般的には、前述のループ並列処理とタスク並列処理を併用して、プログラムの大部分に並列処理を適用することが大切です。
3.3 タスク並列処理

お問い合わせ先

東邦大学 理学部

〒274-8510
千葉県船橋市三山2-2-1
習志野学事部

【入試広報課】
TEL:047-472-0666

【学事課(教務)】
TEL:047-472-7208

【キャリアセンター(就職)】
TEL:047-472-1823

【学部長室】
TEL:047-472-7110

お問い合わせフォーム