概要
- 定数倍高速化の闇魔法
下位ページ
コーディングの前に
- 最適化-O3は基本的に同じことをやっている
- でも人でやらないと、ifを減らすみたいなことはできないからこれをやる必要がある
- 「いかに load や set を減らせるか」が早くなるかどうかのポイント
- [MIMDはマルチスレッド>http://www.slideshare.net/FukushimaNorishige/ssii-33751285
]、GPGPUもSIMD。ここではCPUのSIMDについて。
- 化学系ではSIMD + Intel MKLで殴ってる
- 一部の需要はあるしそういうとこではかなり意味があるがSIMDやるくらいならGPUに任せる、CPUは小さいMIMD(スレッド)をたくさんつくるとかのが綺麗そう。
- 確かに並立化効率がx2とかx4くらいだと、GPGPUほどの並列が組めなくて、レイテンシばかり増えてくるみたいな感じ
- ライブラリ関数一覧
ハードウェア
- サイズはたしか端子の大きさが電源供給の点である程度必要で律速
例
SSE
- SSE=SIMD - Simple Instruction Multiple Data
- SSE (Streaming SIMD Extensions) と呼ばれる拡張命令セット。AVXがその後継
- 128bitレジスタが用意されてる。
- SIMD組み込み関数(SIMD Intrinsic)を使うには
#include <xmmintrin.h>
#include <emmintrin.h>
- 理論的なもの
- 体系だてたもの
- Atcoderのものもはいってる。複数の問題で解説。
- コンパイラが自動ベクトル化しやすいようにプログラムを書き換える方法
- TC D1Hなどで、ただ自動ベクトル化しやすいようにしただけで8倍速になる!!
- ベクトル内積の例
- くわしい
- 初心者向けの講座。条件式の削除などあり、面白そう
Notが無いのでandnotでやんないといけない http://d.hatena.ne.jp/LS3600/20110910#p1 yukicoderはSSE4.1まで使える http://rsujskf.s602.xrea.com/?memos_sse&datdate=1432985305 if文のSSEはselを使えばよいはず。https://www.kernel.org/pub/linux/kernel/people/geoff/cell/ps3-linux-docs/CellProgrammingTutorial/BasicsOfSIMDProgramming.html(両方の条件で計算しておいて、bitmaskごとにどちらを選ぶかを選択)
SIMDのバージョン
- SSE2(g++デフォルト)
- SSE3
- SSE4.1
- SSE4.2(この辺までは、インラインアセンブリを使えば実は使える)
- AVX