SIMDとベクトルプロセッサ
SIMDとベクトルプロセッサは、単一の命令を多数のデータ要素に一度に適用することでデータレベルの並列性を活用し、マルチメディア、科学計算、機械学習カーネルなどの定型的で反復的な計算を高速化します。
Definition
SIMD(単一命令複数データ)とベクトル処理は、広幅のベクトルレジスタまたはSIMDレーンに保持された複数のデータ要素に対して、1つの命令が同時に同じ演算を実行し、データレベルの並列性を活用するアーキテクチャ技術です。
Scope
このトピックでは、単一命令複数データ実行について扱います。具体的には、ベクトルレジスタとパイプラインレーンを備えた古典的なベクトルプロセッサ、コモディティCPUにおけるSIMD拡張、マスキングとプレディケーション、およびデータ並列性が有効である条件についてです。データ並列ハードウェアのアーキテクチャを扱いますが、コア間のスレッドレベル並列性(マルチコアおよびチップマルチプロセッサ)や、大規模なメニーコアGPUモデル(GPUアーキテクチャ)は、重複する部分もありますが、対象外とします。
Core questions
- 多数のデータ要素に1つの命令を適用することで、どのように並列処理の高速化が達成されるのでしょうか?
- ベクトルプロセッサは、コモディティCPUのSIMD拡張とどのように異なるのでしょうか?
- マスキングとプレディケーションを用いて、条件付き演算はどのように処理されるのでしょうか?
- どのような種類の計算がデータ並列実行から最も恩恵を受けるのでしょうか?
Key concepts
- 単一命令複数データ (SIMD)
- ベクトルレジスタとレーン
- ベクトル長とストリップマイニング
- マスキングとプレディケーション
- ギャザー/スキャッター
- SIMD CPU拡張
- データレベル並列性
- スループット指向実行
Key theories
- 単一命令複数データによるデータレベル並列性
- 配列の多数の要素に対して同じ演算が独立して適用される場合、1つの命令で多数の並列レーンまたはパイプライン化されたベクトルユニットを駆動でき、命令フェッチと制御を大量のデータに償却することで、定型的な計算に対して高いスループットが得られます。
Mechanisms
ベクトルプロセッサは、要素の配列をベクトルレジスタに保持し、パイプライン化された、または複製された機能ユニットを介してそれらを処理します。1つの命令がベクトル全体に対する演算を指定し、長いベクトルはチャンク(ストリップマイニング)で処理されます。CPUのSIMD拡張は、固定幅のレジスタを提供し、要素ごとに演算を行います。マスキングは要素ごとの条件付き実行を可能にし、ギャザー/スキャッター操作は非連続なメモリアクセスを処理します。
Clinical relevance
データ並列ハードウェアは、現代のプロセッサのピークスループットの大部分を提供します。SIMD拡張は、メディアコーデック、画像処理、物理演算、およびディープラーニングの基盤となる密な線形代数を高速化し、ベクトルアーキテクチャはスーパーコンピューティングを支えています。効果的な利用は、コンパイラとプログラマが定型的でベクトル化可能な計算を公開できるかどうかにかかっています。
History
ベクトル処理は、1970年代にCDC STAR-100、特にCray-1などのスーパーコンピュータによって開拓されました。データ並列性は、1990年代後半からSIMD拡張(MMX、SSE、AVX、NEON)を通じてコモディティCPUに再導入され、スケーラブルベクトル拡張と密な数値計算ワークロードの再興により、ベクトルアーキテクチャへの関心が再び高まりました。
Key figures
- Seymour Cray
- Michael J. Flynn
- John L. Hennessy
- David A. Patterson
Related topics
Seminal works
- hennessy2019
- patterson2020
Frequently asked questions
- SIMD拡張とベクトルプロセッサの違いは何ですか?
- SIMD拡張は、従来のCPUに固定幅のレジスタ(例えば128ビットまたは256ビット)を追加し、命令ごとに設定された数の要素を操作します。ベクトルプロセッサは、ベクトルレジスタと、多くの場合可変長の長いベクトルに対して動作する命令を中心に構築されており、通常は深くパイプライン化されたレーンを介して処理されます。
- なぜすべてのプログラムがSIMDの恩恵を受けるわけではないのですか?
- SIMDは、同じ演算を多数の独立したデータ要素に規則的なメモリアクセスで適用する計算を高速化します。分岐、不規則なデータ依存性、または散在するメモリアクセスが支配的なプログラムは、並列レーンを有効に活用できないため、ほとんど恩恵を受けません。