入門の記録C++SSESIMDAVXはじめにIntelが考案したSSE/AVXという命令セットを利用することで、CPUで実行するコードのSIMD化によって高速化が図れます。SIMD化はどういうものかから解説を始め、どうやってどのくらい高速化できたかなどを備忘録を兼ねて記していきます。勉強中ゆえどうしても誤った記述をしてしまうかもしれません。C/C++の文法が分かる方SIMDとかSSEって何?単語だけは耳にしたことあるけど...くらいの方。基本的なCPU周辺のアーキテクチャを知っている方。程度がわかっていればOK概観の説明SISDとSIMDCPUは実行ファイル(や、アセンブリプログラム)に記述された命令を読み込んで実行します。SSE/AVXを利用しない通常の命令セットでは、1つのデータに対して1つの演算を行います。フリンの分類で言うSISDというものです。すると、CPUリソースが無駄になってしまうことがあります。任意の演算において、計算する必要のない領域が生まれることがあります。これではCPUリソースの無駄になってしまいます。曖昧な書き方をしてしまっていたので訂正します。「SISD演算が原因でCPUリソースが無駄になる」というわけではありません。この無駄な部分を利用して、本来次のステップで演算される予定だった別のデータに対する演算をこのステップで同時に実行できるようにする、というのがSIMD演算のアイデアです。SSE/AVXCPUでのSIMD演算を可能にしたx86命令セットの拡張が、Intelが考案したSSE/AVXです。Extensionsといいます。AVXは後に考案されたSSEの後継バージョンです。これらはそれぞれ128bitsのxmmレジスタ、256bitsのymmレジスタを利用して演算します。このレジスタはSIMD演算のためにCPUへ組み込まれた追加のレジスタで、それ意外の用途には使われません。ymmレジスタはymm0~ymm15の16個ぶんあります。xmmレジスタも同数で、ymmの半分の領域を共有して利用します。C言語のIntrinsicsプログラマーがCPU命令セットを実行するよう記述するには普通アセンブリ言語でプログラムを書く必要がありますが、それをC言語から呼び出せるようにした組み込み関数が用意されています。これらはIntrinsicsと呼ばれる関数群です。SSE/AVXも同様にIntrinsicとしてC言語から実行できます。並列処理とSIMD演算の違い並列処理は、1つの処理をCPUの複数のスレッドで分担させて行います。対して、SIMD演算は複数のデータに対する1つの命令をCPUの1つのコア内のxmm/ymmレジスタで分担させて行います。C++プログラムのSIMD化C++によるIntrinsics実行Intrinsicsを利用する際は、メモリからxmm/ymmレジスタへ値をロードレジスタ間演算レジスタからメモリへ値をストアという流れで実行します。a)などの関数を呼び出すことで実行できます。4などプログラマーが好きに切って使えます。そのため、各型に対応するIntrinsicsが大量に用意されています。Guideがそのリファレンスサイトとなっているので、関数を探しながら書くのがよさそうです。ベクトルと行列の積お膳立てが済んだところで、C++からのIntrinsics呼び出しによる高速化を試してみます。要旨と関係ない部分のコードは冗長になるので割愛します。ymmレジスタへのロード&ストアコスト演算回数が少なくなっているので、高速化が期待できます。ベンチマーク前項の内容を含む時間計測の実装です。microsec3次元ベクトルの内積/外積程度の演算回数ではあまり高速化できないどころか、(おそらく)ロード&ストアのオーバーヘッドのせいで遅くなってしまうようです。対して、演算回数の多いベクトルと行列の積では-O3で2倍、-O0で1.2倍程度高速化できているのがわかります。Faultでプログラムが落ちる。resultReg);分からないところ・疑問など一通り触ってみて、記事執筆中に湧いた新たな疑問などを参考のため残します。通りならば、Intrinsicsを含むコードを実行する並列スレッド数(std::threadなどのインスタンス数)をCPUのコア数より多くすればxmm/ymmレジスタの値が破綻し得る?コンパイラの最適化は、可能な部分を自動でSIMD化してくれるのか?SSE/AVXのほかにFMAという命令セット拡張があり、SSE->AVXのようにサイズが増えたわけではないらしい。ような演算もレジスタを利用して演算するはず。Intrinsicsに触れてみてその機運がとても高まりました。ここまで読んでいただいた方、ありがとうございました。何かの参考になれば幸いです。requestStockLike6@Nao-Shirotsuゲームに関するプログラマ志望の学生です。C++でゲームやグラフィック関連の何かを作った話がメインになってくると思われます。upLoginユーザーは見つかりませんでした。