はじめてのSSE その1

CSAの読み込み部の説明が終わったので、CSAの書き出し部の説明に入る前に、ちょっと息抜きにSSE命令の使い方を解説します。


まずBitboardを使っているとして、使えそうなSSEの命令はSSE2とSSE4の命令です。


どちらも128bit幅の演算が一命令で出来ますので、将棋のBitboard同士のbitwise and/or/xorが一命令で出来るというわけですね。また、notはありませんが、これについてはandnotを使います。詳しいことは追々書きます。


それでですね、WindowsはXPのときからx86 edition(32bit OS)とx64(64bit OS)とがあって、みなさん大きな置換表を確保するために基本的にx64で開発されていると思うのですが、x64ですと、int型の変数(32bit)をindexにして配列をlook upしようとしたときに、配列は64bitアドレス空間にありますから、前者を64bit幅に拡張する必要があって、そういうアドレス計算の部分で余計に遅くなることが多々あります。


x64用にコンパイルすると、64bit変数をうまく活用していないとむしろ遅くなります。(x64ですとレジスタは豊富にあるので、その部分のメリットもあるので、普通は、x86用にコンパイルするのに比べて遅くはならないですが…)


ともかく、そんなx64環境にあまりメリットを感じない方は、x86環境で開発しておられると思うのですが、x86環境では、レジスタは32bitまでしか扱えないのに、SSE命令を使うと一気に128bitが扱えてしまいます。一気に4倍です。


x86環境でSSE命令が使えることに驚きですが、「こんな拡張命令を使えるようにする技術があるなら、x86環境でも64bitレジスタを使わせてくれればいいのに…」と思うのは私だけではないはずです。何故x86環境で64bitレジスタが使えないのかは謎です。たぶん大人の事情でしょう。私にはよくわかりません。



それで、x86環境でSSEを使った時の効果は絶大です。一度に扱えるデータの幅が32bitからいきなり4倍になるのですから、これで効果がないはずがありません。SSEの1命令は、普通のx86の命令とさほど変わらないので、実にその速度は3〜4倍になります。


要するに、x86環境でSSEを使わないのはもったいない。使えったら使え!です。


つづく