NNI
命令セットの話である。NehalemにはSSE4.2が搭載されるという話は既にレポートした通りであるが、IDFではこのSSE4.2の拡張と、これに続くものとしてIntel AVXの話題が出てきた。ただIntel AVXのターゲットはNehalemの次世代(Westmereの更に次)なので、こちらは別にレポートすることにして、とりあえずNNIのみ紹介したい。
さてNNIことSSE4.2(Photo43)である。Intelとしては珍しく、SSE4.2に関してはPenrynのSSE4.1と一緒に命令の詳細が公開されており、SSE4.1は47命令、SSE4.2は7命令となっている。このSSE4.2で追加された命令の大半は全くSIMDとは無関係な処理で、このためかIntelはSTTNI/ATAという呼び方をしている。大半、というのはSTTNIの4命令、ATAの2命令は全くSIMDではなく、唯一PCMPGTQ(Compare Packed Data for Greater Than)だけがSIMDらしい命令と言えるが、実はこれは64bitの比較演算である。一応上位64bitと下位64bitを別々に比較し、結果も別々に返ってくるのでSIMDといえばSIMDだが、ちょっと毛色が異なっている。
Photo43:最近はこうした言い方をあまりしなくなったが、Katmaiで追加されたSSEがKNI(Katmai New Instruction)、Prescottで追加されたSSE3がPNI(Prescott New Instruction)といった具合。ただConroeのSSSE3とかPenrynのSSE4.1では、こうした呼ばれ方はしないあたりが不思議だ。 |
さて残りの6つだが、STTNIとATAは全く異なる命令である(Photo44)。STTNIには、
・PCMPESTRI - Packed compare explict-length strings, return index in ECX/RCX・PCMPESTRM - Packed compare explict-length strings, return mask in XMM0
・PCMPISTRI - Packed compare implict-length strings, return index in ECX/RCX
・PCMPISTRM - Packed compare implict-length strings, return mask in XMM0
という4つの命令が含まれる。
これを使って何ができるか、というのがPhoto45である。STTNI命令はSIMDではないが、XMMレジスタを使って高速な文字列処理を行うというコンセプトである。具体的な例がPhoto46に示されているが、これは直接アプリケーションプログラマが扱うというよりも、文字列ライブラリの中をこれで作り変えるといった趣の命令である。実際にstrlen()(文字列の長さを返す関数)を記述した例が示されているが(Photo47)、どちらかというとこれはIntelがPerformance Primitiveとしてライブラリを提供すべき命令の類な気がする。
次にATAのほうだが(Photo48)、CRC32はいわゆる32bitのCRCを計算するもの、POPCNTはBitMaskの比較(与えられた値の中でbitに"1"がセットされている数を返す)というものだ。POPCNTは、これまでだとbit演算を多用することになり、x86そのままだとどうしても時間がかかる内容だから判らなくもないし、CRC32は特に通信などでは多用されるから命令を入れても悪くは無いだろう。CRC32の場合の性能向上例がPhoto49だが、これはやはりサーバー向けの拡張と考えたほうが良いだろう。これらの命令は、Intel C++の10.xやVisual Studio 2008などでサポートされるとしている(Photo50)。