|
>SSEはトータルのレジスタサイズが大きいので、
>うまく組めば、計算の間メモリアクセス無しの、
>オンレジスタで処理できますよね。
>そうすると、メモリアクセスを
>計算処理にかかる時間で隠蔽しやすくなるので、
>メモリアクセスがボトルネックになりますよね。
>計算が複雑であれば複雑であるほど、そうなりますね。
>#複雑というか、同じデータに対する演算回数が多い=計算式が長い場合かな。
3x3の行列計算なんかはかなり典型的な例なので SSE で書きやすいですが、非一時ストア命令とプリフェッチ命令を組み合わせて上手く書けば、memmove より高速に、ベクトルの配列を変換しつつ転送できますネ。
メモリ転送関数と、座標変換関数を以前にテストしたのですが、通常の memmove だと、2 Byte Read+Write / FSB clock であるのに対し(理屈通り;586 では 1.5 程度になると思います)、SSE 専用命令による転送では、3 Byte Read+Write / FSB clock です(1 FSB clock で 48 bit 転送できている計算です)。
一方、SSE 命令による座標変換を伴う転送では、まったく同じ、3 Byte Read+Write / FSB clock に相当する処理能力となりました。
因みに、FPU 命令では、1.17 Byte Read+Write / FSB clock に相当する処理能力でしたが、Pentium4 で実行したところ、memmove とまったく同じ 2 Byte Read+Write / FSB clock の結果が出てきました。
>Itaniumなんかだと、あれだけレジスタがあれば、
>本当にほとんどのルーチンを
>オンレジスタでやれちゃいそうですね。
私の知識では、Itanium のアーキテクチャでは、汎用レジスタは 31 本で(32本あって、1つはゼロ固定だった気が)、それ以降の 127 番目までのレジスタはスタックレジスタで、実際のメモリ上のスタックを投影したようなノリの使い方になっていた気がします。
しかし、Itanium のアセンブリは結構アツイので、いつかは実際に触ってみたいところです。
今現在は、SSE2 の方が興味を引いておりますが。
|
|