simd in dlang

23
D 言言言 SIMD @ocxtal 2016/3/19 shibuya.d

Upload: suzuki-hajime

Post on 19-Jan-2017

523 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: SIMD in dlang

D 言語で SIMD@ocxtal 2016/3/19 shibuya.d

Page 2: SIMD in dlang

whoami @ocxtal : 学生 (M1) @ 東大

ゲノム配列解析のアルゴリズムやってます◦ https://bitbucket.org/suzukihajime/◦ https://github.com/ocxtal

Page 3: SIMD in dlang

今日のトピック D 言語で SIMD したい… !

SIMD ってなに… ?

Page 4: SIMD in dlang

SIMD 、とは ? SIMD : Single-Instruction-Multiple-Data

◦ いわゆるベクトル演算のような概念 SIMD 命令、 SIMD 命令セット、などと呼ぶことも

https://ja.wikipedia.org/wiki/SIMD

Page 5: SIMD in dlang

SIMD 、とは ? 例 1 : 複数要素に対して同時に演算

1 4 -2 5

6 3 2 0

7 7 0 5演算器の並列数だけ高速化できる

Page 6: SIMD in dlang

SIMD 、とは ? 例 2 : ベクトルの要素の並べ替え (shuffle / permutation)

1 4 -2 5

-2 1 5 4 行列の転置などに便利

Page 7: SIMD in dlang

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

主要な 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

D 言語から扱うには ? 標準ライブラリに core.simd が… ?!

Page 10: SIMD in dlang

DMD のサポート template Vector!(T)

◦ 算術演算は一通り可能◦ shuffle や permutation はさっぱり…

Page 11: SIMD in dlang

core.simd Vector!(T) のエイリアス

◦ byte16, int4 などの型が使用可能 x86_64 の SSE 〜 SSE4.2 命令の埋め込み

◦ __simd(XMM.PADDD, a, b) など

GDC 、 LDC では使えない… ! ( ふぇえ )

Page 12: SIMD in dlang

LLVM IR LLVM IR というやつがあってな…

高級アセンブリのようなもの抽象化されたベクトル型+強力な最適化

Page 13: SIMD in dlang

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

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

ldc.simd LLVM IR の vector type に対する処理の template

◦ shuffle 、 extract 、 insert ができる… !

Page 16: SIMD in dlang

shufflevector!(V, mask…)

LLVM IR の shufflevector 命令をラップしたもの

◦ 例http://llvm.org/docs/LangRef.html#i-shufflevector

Page 17: SIMD in dlang

使ってみる 「磯野〜、行列転置しようぜ〜」

Page 18: SIMD in dlang

使ってみる 「磯野〜、行列転置しようぜ〜」

storeUnaligned ないやん…◦ 書いた

Page 19: SIMD in dlang

使ってみる こんな感じ ?

Page 20: SIMD in dlang

使ってみる いえい😁

◦ ldc -O3 -mattr=+sse4.1 -output-s

Page 21: SIMD in dlang

まとめ D 言語で明示的に SIMD 命令を使いたい

◦ ポータブルな方法は Vector!(T) のみ◦ 複雑なことは DMD ではできない◦ LDC の inline IR が便利

◦ 最適化つよいよポータビリティを維持するためには、 C で書いたオブジェクトをリンクするのがベストでは… ?

( 個人の感想 )

Page 22: SIMD in dlang

And more GCC built-in functions というのがあってな…

Page 23: SIMD in dlang

And more… GDC には gcc.builtins というのがあってな…

あとは言わなくてもわかるな ?