データ並列性とは
データ並列性とは、並列コンピューティングの一形態であり、複数のプロセッサを用いて演算を並行して行うことで処理速度を向上させる技術です。この手法では、処理対象となるデータを複数のプロセッサに分割し、各プロセッサがそれぞれ異なるデータ領域に対して同じタスクを実行します。データ並列性は、
タスク並列性とは対照的な概念であり、プログラムの効率的な実行に重要な役割を果たします。
データ並列性の仕組み
データ並列性は、マルチプロセッサシステムや
マルチコアプロセッサなどの
並列計算環境で効果を発揮します。各プロセッサは、割り当てられたデータ領域に対して同じ処理を実行することで、全体の処理時間を短縮します。例えば、2つのプロセッサを持つシステムで、あるデータに対して処理を行う場合、データを2分割し、それぞれのプロセッサが分割されたデータを並行して処理します。
具体例として、2つの行列の加算を考えてみましょう。データ並列性を適用する場合、一方のプロセッサが行列の前半部分の要素を加算し、もう一方のプロセッサが行列の後半部分の要素を加算します。このように、複数のプロセッサが並行して処理を行うことで、単一のプロセッサで逐次的に処理する場合と比較して、大幅な時間短縮が期待できます。
データ並列性は、データの分散された性質に焦点を当てていますが、
タスク並列性は、処理の分散に焦点を当てています。実際のプログラムでは、データ並列性と
タスク並列性の両方が組み合わされて利用されることが一般的です。ソフトウェアレベルでは、
プロセスやスレッドが
並列化の実装単位として利用されます。通常、どの
CPUでタスクを実行するかを
アプリケーションソフトウェアレベルで明示的に指定することはなく、
プロセスやスレッドといった抽象化された実行単位を割り当てるだけにとどめ、実際の計算ノードへの
プロセス/スレッド割り当ては
オペレーティングシステムやフレームワークが担当します。また、プロセッサの命令レベルでのデータ
並列化の概念および機構として、
SIMDおよびSIMTがあります。
データ量が十分に多く、データごとの処理内容が十分に長い場合は、シングルコア
CPUで逐次実行するよりも
マルチコアCPUで並列実行したほうが高速になります。しかし、データ量が少なかったり、データごとの処理内容が極端に短かったりする場合は、かえって
並列化のためのデータ分割処理やスレッドの起動などのオーバーヘッドが大きくなり、逐次実行よりも遅くなることがあります。
データ並列性の例
以下に、データ並列性を示す
擬似コードを示します。
program:
...
if
CPU="a" then
lower_limit := 1
upper_limit := 50
else if
CPU="b" then
lower_limit := 51
upper_limit := 100
end if
do i := lower_limit, upper_limit
Task on d(i)
end do
...
end program
この例では、サイズ100のデータ配列"d"を処理することを目的としています。2つのプロセッサ(
CPU "a"と
CPU "b")が存在する場合、以下のように処理が分担されます。
CPU "a"は、配列"d"の1番目から50番目の要素を処理します。
CPU "b"は、配列"d"の51番目から100番目の要素を処理します。
このように、各プロセッサが異なるデータ領域を処理することで、並列処理を実現しています。
まとめ
データ並列性は、並列コンピューティングにおいて重要な概念です。複数のプロセッサを活用して大規模なデータ処理を高速化する上で、欠かせない技術となっています。データ並列性を理解することで、より効率的なプログラムの開発が可能になります。
参考文献
Hillis, W. Daniel and Steele, Guy L., Data Parallel Algorithms Communications of the ACM December 1986
Blelloch, Guy E, Vector Models for Data-Parallel Computing MIT Press 1990. ISBN 0-262-02313-X
関連項目
タスク並列性
ストリーム・プロセッシング