😸
C 言語 SIMD 入門:目次
はじめに
この記事では AVX2 を使用したプログラミングを解説した記事の一覧を紹介します。
言語はすべて C 言語です。
C# で並列化したい場合はこちらの記事から参照してください。
SIMD とは
SIMD は Single Instruction Multiple Data の略で、一度の命令で複数のデータを処理することができます。
プログラムを高速化する上で非常に重要な技術の一つで、圧倒的な高速化が見込めます。
SIMD は CPU によって命令セットが異なります。
x86 では SSE、AVX、Arm では NEON などがあります。
SSE では 128 ビットのデータを、AVX(AVX2)では 256 ビットのデータを 1 つの命令で処理できます。
このシリーズの記事では Haswell 世代(2013 年発売)以降の CPU で使用できる AVX2 を使用しています。
C言語からは immintrin.h ヘッダーファイルをインクルードすることで、SIMD 命令と一対一に結び付いた関数を使用することができます。
MSVC では intrin.h ヘッダーファイルをインクルードすることで SSE などにも対応できますが、MSVC でしか使用できません。
コンパイラーは MSVC を対象にして解説しています。記事によっては他のコンパイラーで動かないことがあります。
記事一覧
- 配列内の最小値と最大値
- 配列内の要素のインデックスを求める
- 2 つのベクトルの内積を計算する
- 配列内の全要素の和を求める
- 配列の分散を求める
- 2 つの配列の共分散を求める
- 2 つの配列の相関係数を求める
- 行列のスカラー倍を計算する
関数一覧
今までに解説した関数の一覧です。
どの記事でも解説は同じです。
算術演算
_mm256_add_epi32
_mm256_hadd_epi32
_mm256_mullo_epi32
比較操作
_mm256_cmpeq_epi32
_mm256_min_epi32
_mm256_max_epi32
読み取り・書き込み操作
_mm256_loadu_si256 _mm256_storeu_si256
- 配列内の最小値と最大値
- 配列内の要素のインデックスを求める
- 2 つのベクトルの内積を計算する
- 配列内の全要素の和を求める
- 配列の分散を求める
- 2 つの配列の共分散を求める
- 2 つの配列の相関係数を求める
- 行列のスカラー倍を計算する
挿入/抽出操作
_mm256_extract_epi32
その他の操作
_mm256_movemask_ps
_mm256_set1_epi32
_mm256_setzero_si256
パックドテスト操作
_mm256_testz_si256
置換操作
_mm256_permute2x128_si256
ベクトルの型キャスト操作
_mm256_castsi256_ps
参考になるサイト
- Intel Intrinsics Guide インテルの公式ドキュメントで、関数が一覧表になっていています。パフォーマンスに関する情報が記載されています。
- インテル AVX2 命令の組み込み関数 こちらもインテルの公式ドキュメントです。日本語ですが、パフォーマンスについての情報はありません。
- AVX/AVX2/AVX512 アドベントカレンダー2021イントロダクション 日本語で各関数を詳細に解説しています。とてもわかりやすいですが、一部の関数だけです。
Discussion