【最新パーツ性能チェック(Vol.23)】いよいよプレスコット登場(PART2)! SSE3の神髄に世界で初めて触れる!
|
2004年3月1日
Vol.22ですでにお伝えしたように、Prescottの性能は同クロックの旧Pentium 4(Northwood)と同等か、テストによってはプラスアルファ、という場合が多い。2次キャッシュが倍増した分は、アクセスレイテンシが増えたことでかなり相殺されてしまっている。ただ、Prescottには13の新命令からなる拡張命令セット“SSE3”が搭載され、アプリの対応による今後の速度アップが期待できる。今回は、現状ほぼ唯一のSSE3対応ソフト「TMPGEnc 3」で具体的なパフォーマンスについてチェックするとともに、SSE3の詳細について解説しよう。
 |

アスキープラスVol.14発売中!速かったり遅かったりする謎の新CPUプレスコットの性能から謎までを一網打尽にする「プレスコットそこが知りたいギモン30」、パラレル版と価格差がなくなって今が買い時の「シリアルATA HDDに乗り換えろ」、ワイヤレスLAN内蔵ルータ徹底ガイド、5万円PC自作術など、今月も自作ユーザーのためのお買い物ガイド情報満載! お近くの書店でみなさまをお待ちしています。 |
SSE3は“x86サービスパック”
PNI(Prescott New Instructions:プレスコット新命令)として知られてきた、Prescottで追加される13の新命令は、正式に“SSE3”という名前が付けられることになった。もっとも、仰々しい名前の割に、その正体はもうひとつすっきりしない。13という命令数からして、MMXの57個、SSEの70個、SSE2の144個とは比較にならない小規模であるが、加えて、これまでの拡張命令セットが、これまで達成できなかったことに新たにチャレンジする、明確な目標があったのに対し、SSE3ではそれが見あたらない。
MMXはSIMD整数、SSEはSIMD単精度浮動小数点、SSE2はSIMD倍精度浮動小数点&MMXのSSE対応、という、シンプルに説明できる大きな実行目標があった。その点、SSE3は、対応目的が大きく分けて6つもあり、それぞれが比較的具体的な=逆に言うと、あまりスケールの大きくない=目標を据えているため、全体的なインパクトが小さく感じられる。具体的には以下の通り。
1、FISTTP命令
浮動小数点演算の強化。従来、FPUによって計算された結果を、最終的に整数の値として取り出すのには、どのような丸め(切り上げ、切り捨て等)を行なうか、何ビットのデータとして取り出すか、といった条件を別途セットする必要があり、内容の待避/復帰も含めるとかなりのクロック数を必要としていた。FISTTPは、保存先レジスタのサイズをビット数の指定と見なし、丸めは切り捨て/負の場合には切り下げという前提で、結果の取り出しを行なってくれる。
2、LDDQU命令
メモリアクセスの高速化。実際には動画圧縮の高速化に大きく貢献する。詳細は後述する。
3、ADDSUBPS、ADDSUBPD
複素数計算の高速化。2乗すると-1になるi(虚数単位)を含む「複素数」のかけ算、割り算における手間を減らせる。
4、HADDPS、HSUBPS、HADDPD、HSUBPD
水平加算。SIMD演算の結果を保持するレジスタ内部での加算。SIMD命令は、同時に行なった演算の結果を最終的に一つのレジスタの中に並んだ形で格納するが、それらを最終的に足し合わせる処理は、結構使用頻度が高い割りに専用の命令がない。従来は、別のレジスタに待避させてシフトする、あるいはシャッフル命令で割り付けた上で再度加算、といった処理を繰り返す必要があった。水平加算命令は、レジスタ内で隣りあう2つの浮動小数点データを足したり引いたりできる。これは、内積の計算に最適であるほか、3Dデータの格納方法として、従来、プログラミングはしやすいがスピードが出ないことから採用しにくかったAoS(Array of Structure)という方式を利用可能にするというメリットもある。
5、MOVSHDUP、MOVSLDUP、MOVDDUP
SSEレジスタ内の浮動小数点データを、隣の場所に複製する命令。SIMD演算の後、得られた結果をさらに複数の演算に使いたいときに重宝する。また、もともとSSEにおける浮動小数点データは、任意の位置に移動するための命令が少ない。整数演算系では、シャッフルという命令でほとんどどのようにも並べ替えができるのだが、浮動小数点データのシャッフルは移動できる位置が限られている。このほかには、本来別の用途のアンパックという命令しかない。これらの命令は、従来は対応できなかった移動パターンのいくつかにも対応できる。
6、MONITOR、MWAIT命令
仮想CPUの動作スレッドの動作制御。ハイパースレッディング対応のCPUは、実際には1つのCPUを2つに見せかけているため、何かを見張り続けるようなスレッドが走っていると、HTナシの場合よりも速度が大きく下がってしまう場合がある。MWAIT命令を発行すると、そのスレッドは休止状態になり、MONITOR命令で指定されたメモリアドレスに書き込みが行なわれるまでCPUリソースを消費しないため、HT対応システムでも理想的なCPUパワー配分が可能になる。
もっとも、これら一つ一つは、それぞれの応用範囲においては待ち望まれていた機能だ。結局、MMXからSSE2までで、SIMD演算によって可能になる新しい機能のサポートは、ほぼ一段落したが、そこまでで拾いきれなかった弱点をピンポイントで補強したのがSSE3ということができる。その意味ではSSE3は、実態はSSEのサービスパック、あるいは、x86命令セットに対するサービスパックと捉えることができる。
ところで、これら13命令は一式PNI(SSE3)として資料にまとめられているが、CPUがサポートする機能を示すCPUID命令の戻り値(ECXレジスタ)では、SSE3対応を示すビットのほかに、MONITOR/MWAIT対応を示すビットが別途設けられている。わざわざ分離されているということは、SSE3非対応だけどMONITOR/MWAIT対応とか、その逆のプロセッサが出荷される可能性を匂わせている。HT非対応のPrescottコア版Pentium 4-2.8AGHzや、同じくHT非対応と思われるPrescott Celeronにおいては、SSE3の1〜5はサポートされるがMONITOR/MWAITがサポートされず、そのことを明示するため、と考えるのが自然だろう。
なお、LDDQU、MONITOR/MWAITの詳細については2月28日発売のアスキープラスVol.14にて、また、ADDSUBPS等「複素数対応」、HADDPS等「水平加算」については発売中の月刊アスキー2004年3月号に掲載しているので、今日のある方はチェックしていただければと思う。
SSE3で大幅アップするTMPGEnc 3の性能
では、実際にSSE3ではどのくらい性能がアップするのだろうか。まっさきにSSE3に対応したペガシス社のTMPGEnc 3を用いて、性能がどう変わったかを見ていくことにしよう。ちなみにTMPGEnc 3では、環境設定メニューにおいて、SSE3利用のオン/オフを切り替えることができるため、SSE3の効果を直接的に知ることができる。
167MBのDVフォーマットのAVIファイルに対して、標準、高画質、最高画質の3パターンで、SSE3の有無によってPrescott 3.2GHzの性能がどう変わるかを計測した。また、比較用に、NorthwoodコアのPentium 4-3.2GHzでの計測結果も併記する。
 |

TMPGEnc 3の画面。操作の手順が上部に並べられ、いっそう使いやすくなっている |
 |

TMPGEnc 3の環境設定パネル。さっそくSSE3のチェックボックスが追加されている |
 |

TMPGEncによるMPEG2ファイル作成時間 |
見てのとおり、SSE3対応の効果は非常に大きい。10.3〜13.4%もの性能向上を見せている。エンコード性能は比較的CPUクロックをリニアに反映するので、平均して12%のアップだとすれば、3.2GHzのCPUにとっては400MHz近くもアップしただけのゲインである。このように、SSE3はそのピンポイントに当たった用途においてはかなりのメリットをもたらすことがよくわかる。
ところで、TMPGEnc 3はSSE3のどの命令が用いられて高速化されているのだろうか? 可能性として一番高いのは、LDDQU命令だ。これを活用すると、MPEG圧縮時に非常に大きな負荷となる「動きの検出」において、かなりの性能向上が期待できるからだ。動きの検出は、ある画素ブロックを、時間的に前、あるいは後ろのフレーム(画面)上に1ドット、あるいは半ドット単位でずらしながら重ね合わせていき、もっともよく一致する場所を探す、という、人間だったら10秒でめげてしまいそうな、とてつもない力業だ。ここで、画素ブロックのデータはSSEレジスタに入っているが、前、あるいは後ろのフレーム(画面)はメモリ上に置かれるわけだが、1ドット単位でずらしながらチェックする、ということは、要するに、1バイト単位でアドレスを変えながら読み出しては、(比較中の画素情報を収めた)レジスタと内容を比較していく、という作業になる。ここにLDDQU命令の出番がある。
LDDQU命令は、メモリ上の任意の位置から128ビットの整数データを読み出し、XMMレジスタに格納する、という命令だ。──もちろん、こんな基本的な動作が今までできなかったわけではない。同様の命令として、MOVDQAとMOVDQUという2つの命令が、SSE2で新設されている。
MOVDQAは動作が高速なのだが、読み出し先のメモリアドレスが16バイト(128ビット)境界に一致していなければならない、という制約がある。分かりやすくいえば、16進数で表現したアドレスの、最下位バイトが0のときにのみ利用可能で、残り、1〜Fまでの場合には、無理に使うと一般保護例外を発生してしまう。これでは、動きの検出のように、1バイト単位でずらしながら──すなわち、最下位バイトを0〜Fまで変化させながら読み出す用途には使えない。
もう一つの命令、MOVDQUのほうは、このような制約がないかわりに、動作は遅い。どれくらい遅いかは公表されていないが、遅いことは確からしい。
今回新設されたLDDQU命令は、MOVDQU命令同様、メモリアドレスの制限がない128ビットの読み出し命令だ。MOVDQU命令と異なるのは、MOVDQUが、本当に指定された128ビットだけを読み出そうとするのに対し、LDDQUは、末尾アドレス0をまたいで、その前後の256ビット分のデータを読み出してしまい、必要部分を合成する、というアプローチだ。以下のようになる。
●MOVDQU
欲しいデータ 56789ABCDEF01234
読み出し 567 89ABCDEF 01234
●LDDQU
欲しいデータ 56789ABCDEF01234
読み出し 0123456789ABCDEF 0123456789ABCDEF
MOVDQUは、本当に必要な部分だけを何回かに分けて読み出して合成する。不必要な部分に対してはメモリアクセスを行なわない、その意味では「正しい」「律儀な」動作だ。実際にどのような単位で読み出しているかは文献には記されていないが、今回実験した結果から、ほぼ間違いなく、上のように、メモリアドレスの末尾が0または8から始まる64ビット単位で、必要な部分だけをアクセスする、という動作のようだ。この場合、128ビットのデータを読み出すには3回のメモリアクセスが必要になる。これに対し、LDDQUは、アドレスの末尾が0から始まる2つの128ビットデータを読み出す。この、末尾が0からの128ビットリードというのは、ほかならぬ、高速なMOVDQA命令の動作にほかならない。つまり、LDDQUは2回のMOVDQA動作を行なったうえで、必要な部分を切り出す、という動作を行なう。
こうすることで高速化できるのなら、MOVDQU命令の内部的な動作を変更すればいい、と思われるかもしれないが、LDDQUは「いらない部分まで読む」ために、別の問題を抱える可能性がある。たとえば、最初の3のアドレスに対して書き込みをしようとしている命令が先に存在した場合、LDDQU方式では、この書き込みが完了するまでは読み出しを行なえない(そうでないと、更新前の、古い3のアドレスのデータを読んでしまうことになるため)。MOVDQUなら3の部分は読み出しを行なわないので、即座に読みに行ける。このようなケースではMOVDQUのほうが高速になる可能性がある。不必要な部分も読んでしまうLDDQUの弱点だ。動画圧縮においては、メモリ上には参照されるフレームのデータが収まっており、それは書き換えられることはないため、MOVDQUが有利なケースは考えにくいが、用途によってはMOVDQUのような動作が必要な局面があるため、残したものと思われる。
世界初! LDDQU性能をダイレクトに測定!!
では、実際にLDDQU命令はMOVDQU命令よりどれくらい高速なのだろうか。また、最も高速とされるMOVDQA命令はどれほどの性能を持っているのだろうか。今回はProfessionalhearts製特製メモリ性能テストにより、具体的な性能の比較を行なうことができた。結果がグラフである。なお、ここで表示しているのは1次データキャッシュからXMMレジスタへのデータ転送の速度であり、使用したCPUはPrescott 3.2GHzである。
まず、参考までに高速なMOVDQAの結果だが、45GB/秒という非常に高い性能を示した。1クロックにつき128ビットの転送を行なっている場合、3.2GHz動作では理論上51.2GB/秒の能力を持つはずだが、ほぼそれに迫る値を示した。1クロックで128ビットの転送が行なえていることがわかる。
ただ、この命令は16バイト境界でしか使えないことは説明したとおり。従来のMOVDQU命令は、調べたところ、メモリアドレス末尾が0または8のときに限り19.7GB/秒、それ以外では7.5GB/秒にまで落ちてしまうことがわかった。現実には末尾が0のときにはMOVDQAを使うので、MOVDQUの使われる局面での平均速度は8.3GB/秒。MOVDQA利用時の6分の1ほどに落ちてしまう。3回に分けて読み出し、合成することのオーバーヘッドはこれほどまでに大きいのだ。
 |

Prescott 3.2GHzにおける、命令別メモリからXMMレジスタへのデータ転送能力 |
一方、期待の新人LDDQUは、末尾アドレスにかかわらず19.7GB/秒をキープした。内部動作的に2回のMOVDQAを行なっているから、MOVDQAの半分、22GB/秒が予想される速度だが、ほぼそれに近い値になっている。平均速度で言えば、MOVDQUの3倍近い値だ。メモリアクセス速度がこれほど違えば、動き検出の速度に相当なインパクトを与えるであろうことは想像に難くない。TMPGEnc 3で13%といった速度向上が行なわれているのもこの結果から十分納得できる。
CPUでは、たった一つの命令追加でも、局面によって大きく性能アップが図られることがよくわかる。MONITOR/MWAITや水平加算といったあたりも、対応アプリにおいては測定可能な差が出ることが期待できる。SSE3の効果にはしばらく目が離せない。
なお、PrescottではSSE3以外にも、「かけ算の高速化」「分岐予測の高精度化」も行なわれているという。これについては本日発売のアスキープラスVol.14「マニア新聞」に記事を掲載している。
(アスキープラス編集部 野口岳郎)
|