LoginSignup
8
3

More than 1 year has passed since last update.

AVX/AVX2/AVX512 アドベントカレンダー2021イントロダクション

Last updated at Posted at 2021-11-30

はじめに

このアドベントカレンダーでは,Intel/AMDのCPUで使われるSIMD命令であるAVX/AVX2/AVX512に関する記事を募集しています.

埋まらないときは,現在書いているドキュメント(AVX Complete Guide(仮))の文書の一部を抜粋してアドベントカレンダー埋めていきます.研究室のゼミ資料がベースですので,一応入門的なことが多くなります.
間違っている所などありましたらコメントいただけると幸いです.

希望があればコメント欄に書いていただければそこの記事を埋めます.

一人で埋めてるのはサビシイので,どんな記事でも歓迎です!

SIMD

SIMD (single instruction multiple data) とは,一つの命令を複数データに対して同時に発行し,並列に計算する方法のことです.例えば,SSEによる加算なら,32ビット浮動小数点の配列に入っている4つのデータを1命令で実行可能です.これがAVXになると8つのデータを,AVX-512になると16個のデータを1命令で実行可能です.つまり,データ1つづつ計算するよりもベクトル長倍(4,8,16倍)の効率で動きます.

SIMDは,英語ではシムディ,エスアイエムディ,日本語はシムド,シムディ,エスアイエムディと発音呼ばれます.SIMD演算は,MMXで64ビット,SSEで128ビット,AVXで256ビット,AVX512で512ビットのデータを1命令で並列演算できます.1つの要素が32ビットのデータ(intやfloat)で換算すると,2, 4, 8, 16並列でデータの処理が可能です.

SIMD演算は,古くはMMXと呼ばれ,64ビット整数のベクトル演算が可能でした.それがSSEにより,128ビット浮動小数点により可能になり,SSE2により128ビット整数をサポートしました.その後SSE3, SSSE3, SSE4.1, SSE4.2と拡張され,様々な命令が増えました.AVXでは256ビット浮動小数点演算のベクトル演算が可能となり,AVX2では,256ビット整数ベクトル演算が可能になりました.AVX512では,512ビットベクトル演算が可能になっています.SIMD演算の年表は以下のようになります(ARMのNEONを除く).

Year SIMD CPU
1997 MMX MMX Pentium
1998 3DNow! K6-2 (AMD)
1999 SSE PnetiumIII
2000 SSE2 Pnetium 4
2004 SSE3 Pnetium 4
2006 SSSE3 Core 2
2007 SSE4.1 Core 2
2007 SSE4a Phenom(AMD)
2008 SSE4.2 Core i7
2011 AVX Core i7 2Gen
2013 AVX2 Core i7 4Gen
2016 AVX-512 Xeon Phi

なお,よっぽどの限り必要ありませんが,現在はx64でコンパイルする場合,MMX命令はサポートされません.また,Xeon Phiというおもちゃは残念ながらディスコンです.

説明方法

AVX/AVX2命令は,数多くの命令があります.本稿では,命令を以下の5種類に大別して説明します.

  • Move (データのロードストア)
    • load, storeなど
  • Arithmetic (算術演算)
    • add, sub, fmaなど
  • Logical/Shift/Compare (論理演算,ビットシフト,比較)
    • and, sll, cmpなど
  • Cast/Convert (キャスト)
    • cast, cvtなど
  • Swizzle (データ並び替え)
    • shuffle, permuteなど

なお,通常のSIMD演算は以下の流れを取ります.

  1. ロード(Move)
  2. 適切な型に変換(Cast)およびデータの並び替え(Swizzle)
  3. 算術演算や論理演算(Arithmetic,Logical)
  4. 適切な型に変換(Cast)およびデータの並び替え(Swizzle)
  5. ストア(Move)

また,各命令は下位の表のようにしてレイテンシ,スループットのCPIや,μopsを載せて説明していきます.
例えば,以下は浮動小数点の加算命令です.

__m256 _mm256_add_ps (__m256 a, __m256 b)
__m256d _mm256_add_pd (__m256d a, __m256d b)
asm: vaddps ymm, ymm, ymm //ps
asm: vaddpd ymm, ymm, ymm //pd

動作

_mm256_add_ps
v2_32.png
_mm256_add_pd
v2_64.png

CPI/Uops

Architecture Latency Throughput Uops
Alderlake 2 0.5 1
Icelake 4 0.5 1
Skylake 4 0.5 1
Broadwell 3 1 1
Haswell 3 1 1
Ivy Bridge 3 1 1
Sandy Bridge 3 1 1
Zen3 3 0.5 1
Zen2 3 0.5 1
Zen 3 1 2

目次

AVX Complete Guide(仮)の目次です.
リンク先は,書いたところだけ後で埋める予定です.


8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3