simd in dlang
TRANSCRIPT
D 言語で SIMD@ocxtal 2016/3/19 shibuya.d
whoami @ocxtal : 学生 (M1) @ 東大
ゲノム配列解析のアルゴリズムやってます◦ https://bitbucket.org/suzukihajime/◦ https://github.com/ocxtal
今日のトピック D 言語で SIMD したい… !
SIMD ってなに… ?
SIMD 、とは ? SIMD : Single-Instruction-Multiple-Data
◦ いわゆるベクトル演算のような概念 SIMD 命令、 SIMD 命令セット、などと呼ぶことも
https://ja.wikipedia.org/wiki/SIMD
SIMD 、とは ? 例 1 : 複数要素に対して同時に演算
1 4 -2 5
6 3 2 0
7 7 0 5演算器の並列数だけ高速化できる
SIMD 、とは ? 例 2 : ベクトルの要素の並べ替え (shuffle / permutation)
1 4 -2 5
-2 1 5 4 行列の転置などに便利
SIMD 、とは ? 例 3 : パックド型の変換
他に scatter / gather や string compare なども…
1 4 -2 5
6 3 2 0
6 1 3 4 2 -2 0 5
主要な SIMD 命令セット 命令セット レジスタ幅 対応 CPU など x86_64
◦ SSE 〜 SSE4.2 128bit ほぼ全ての x86_64
◦ AVX1 〜 AVX2 256bit◦ AVX-512xx 512bit Skylake Xeon ( まだない )
AArch64 / ARM◦ NEON 128bit ARMv7 以降のほとんど
Power PC◦ AltiVec 128bit
AVX: Sandy Bridge 〜AVX2: Haswell 〜
みんな似たような命令セットなので、抽象化して扱いたい
D 言語から扱うには ? 標準ライブラリに core.simd が… ?!
DMD のサポート template Vector!(T)
◦ 算術演算は一通り可能◦ shuffle や permutation はさっぱり…
core.simd Vector!(T) のエイリアス
◦ byte16, int4 などの型が使用可能 x86_64 の SSE 〜 SSE4.2 命令の埋め込み
◦ __simd(XMM.PADDD, a, b) など
GDC 、 LDC では使えない… ! ( ふぇえ )
LLVM IR LLVM IR というやつがあってな…
高級アセンブリのようなもの抽象化されたベクトル型+強力な最適化
LDC inline IR LDC inline IR というやつがあってな…
THIS PRAGMA IS NOT WELL TESTED AND
SHOULD ONLY BE USED WHEN ABSULUTELY
NECESSARY
LDC inline IR LDC inline IR の利点
◦ LLVM IR のベクトル型と Vector!(T) の橋渡しができる◦ LLVM の強力な最適化が使える◦ バックエンドも x86_64 に限定されない
欠点◦ LDC でしか使えない◦ THIS PRAGMA IS NOT WELL TESTED AND SHOULD ONLY BE
USED WHEN ABSULUTELY NECESSARY
ldc.simd LLVM IR の vector type に対する処理の template
◦ shuffle 、 extract 、 insert ができる… !
shufflevector!(V, mask…)
LLVM IR の shufflevector 命令をラップしたもの
◦ 例http://llvm.org/docs/LangRef.html#i-shufflevector
使ってみる 「磯野〜、行列転置しようぜ〜」
使ってみる 「磯野〜、行列転置しようぜ〜」
storeUnaligned ないやん…◦ 書いた
使ってみる こんな感じ ?
使ってみる いえい😁
◦ ldc -O3 -mattr=+sse4.1 -output-s
まとめ D 言語で明示的に SIMD 命令を使いたい
◦ ポータブルな方法は Vector!(T) のみ◦ 複雑なことは DMD ではできない◦ LDC の inline IR が便利
◦ 最適化つよいよポータビリティを維持するためには、 C で書いたオブジェクトをリンクするのがベストでは… ?
( 個人の感想 )
And more GCC built-in functions というのがあってな…
And more… GDC には gcc.builtins というのがあってな…
あとは言わなくてもわかるな ?