SIMD in dlang
-
Upload
suzuki-hajime -
Category
Technology
-
view
524 -
download
1
Transcript of SIMD in dlang
![Page 1: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/1.jpg)
D 言語で SIMD@ocxtal 2016/3/19 shibuya.d
![Page 2: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/2.jpg)
whoami @ocxtal : 学生 (M1) @ 東大
ゲノム配列解析のアルゴリズムやってます◦ https://bitbucket.org/suzukihajime/◦ https://github.com/ocxtal
![Page 3: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/3.jpg)
今日のトピック D 言語で SIMD したい… !
SIMD ってなに… ?
![Page 4: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/4.jpg)
SIMD 、とは ? SIMD : Single-Instruction-Multiple-Data
◦ いわゆるベクトル演算のような概念 SIMD 命令、 SIMD 命令セット、などと呼ぶことも
https://ja.wikipedia.org/wiki/SIMD
![Page 5: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/5.jpg)
SIMD 、とは ? 例 1 : 複数要素に対して同時に演算
1 4 -2 5
6 3 2 0
7 7 0 5演算器の並列数だけ高速化できる
![Page 6: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/6.jpg)
SIMD 、とは ? 例 2 : ベクトルの要素の並べ替え (shuffle / permutation)
1 4 -2 5
-2 1 5 4 行列の転置などに便利
![Page 7: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/7.jpg)
SIMD 、とは ? 例 3 : パックド型の変換
他に scatter / gather や string compare なども…
1 4 -2 5
6 3 2 0
6 1 3 4 2 -2 0 5
![Page 8: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/8.jpg)
主要な 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 〜
みんな似たような命令セットなので、抽象化して扱いたい
![Page 9: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/9.jpg)
D 言語から扱うには ? 標準ライブラリに core.simd が… ?!
![Page 10: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/10.jpg)
DMD のサポート template Vector!(T)
◦ 算術演算は一通り可能◦ shuffle や permutation はさっぱり…
![Page 11: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/11.jpg)
core.simd Vector!(T) のエイリアス
◦ byte16, int4 などの型が使用可能 x86_64 の SSE 〜 SSE4.2 命令の埋め込み
◦ __simd(XMM.PADDD, a, b) など
GDC 、 LDC では使えない… ! ( ふぇえ )
![Page 12: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/12.jpg)
LLVM IR LLVM IR というやつがあってな…
高級アセンブリのようなもの抽象化されたベクトル型+強力な最適化
![Page 13: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/13.jpg)
LDC inline IR LDC inline IR というやつがあってな…
THIS PRAGMA IS NOT WELL TESTED AND
SHOULD ONLY BE USED WHEN ABSULUTELY
NECESSARY
![Page 14: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/14.jpg)
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
![Page 15: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/15.jpg)
ldc.simd LLVM IR の vector type に対する処理の template
◦ shuffle 、 extract 、 insert ができる… !
![Page 16: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/16.jpg)
shufflevector!(V, mask…)
LLVM IR の shufflevector 命令をラップしたもの
◦ 例http://llvm.org/docs/LangRef.html#i-shufflevector
![Page 17: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/17.jpg)
使ってみる 「磯野〜、行列転置しようぜ〜」
![Page 18: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/18.jpg)
使ってみる 「磯野〜、行列転置しようぜ〜」
storeUnaligned ないやん…◦ 書いた
![Page 19: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/19.jpg)
使ってみる こんな感じ ?
![Page 20: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/20.jpg)
使ってみる いえい😁
◦ ldc -O3 -mattr=+sse4.1 -output-s
![Page 21: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/21.jpg)
まとめ D 言語で明示的に SIMD 命令を使いたい
◦ ポータブルな方法は Vector!(T) のみ◦ 複雑なことは DMD ではできない◦ LDC の inline IR が便利
◦ 最適化つよいよポータビリティを維持するためには、 C で書いたオブジェクトをリンクするのがベストでは… ?
( 個人の感想 )
![Page 22: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/22.jpg)
And more GCC built-in functions というのがあってな…
![Page 23: SIMD in dlang](https://reader033.fdocuments.net/reader033/viewer/2022061612/587fe9961a28ab46228b5fc7/html5/thumbnails/23.jpg)
And more… GDC には gcc.builtins というのがあってな…
あとは言わなくてもわかるな ?