アカウント名:
パスワード:
メインメモリが4~8GB程度なら、64bitでのロスを考えるとx86にPAEでも良いけどさメモリ16~32GB積んでx86は無いでしょ、常識的に考えて…しかし今や8GB DIMMですら5000円以下の時代だからねそりゃあ今更x86とか使ってらんないよ
メモリ量の64bitのロスよりx87 -> SSEによる浮動小数点演算の高速化のメリットのほうがでかいっす。
Apacheのhttps処理速度なんて10倍ぐらいでるもん。
AES周りに専用の命令を使っていたってオチ?
単純なコードで試した場合に、fpu と sse とで何倍くらいの差がでるのか試してみました。(float型の3万個程度の配列の各要素を2乗する場合で、fpuとsseでどの程度の差がしょうじるか)
http://codepad.org/Ot3oQyRV [codepad.org]fs() は、普通にループで普通に掛け算するだけです。fv_a() は、掛け算を sse のに置き換えて、4個づつ計算してくようなの。(4倍速いはず?)fv_b() は、32要素づつまとめて計算してくかんじの。(xmmレジスターは1個だけで使いまわし)fv_c() は、fv_b()と同じだけど、xmmレジスターを無駄に8個全部使うかんじの。(xmmレジスターを沢山使うと逆に遅くなるかどうか)
それぞれを交互に1000回試して、各関数毎にトータルの所用時間をくらべてみました
gcc -O0 でコンパイルした場合 : fs: 301437253 clock (1.000000 fs/fx) fv_a: 87463181 clock (3.446447 fs/fx) fv_b: 33049757 clock (9.120710 fs/fx) fv_c: 33274995 clock (9.058972 fs/fx)いちおう、ただsseに置き換えるだけで 3.5倍速くなって、もっとがんばると10倍くらい速くなってるみたいです、-O0ですが。
gcc -O3 でコンパイルしたばあい: fs: 66715454 clock (1.000000 fs/fx) fv_a: 31263297 clock (2.133987 fs/fx) fv_b: 30580498 clock (2.181634 fs/fx) fv_c: 29792373 clock (2.239347 fs/fx)普通のコードが最適化で速くなって、sse との速度差が2倍程度にまで縮まる。あと、sseの3種類の関数の速度差が悲しい程に縮まる。
gcc -O3 -msse2 でコンパイルした場合(悲しいお知らせ) fs: 30884061 clock (1.000000 fs/fx) fv_a: 33528261 clock (0.921135 fs/fx) fv_b: 30616261 clock (1.008747 fs/fx) fv_c: 29912155 clock (1.032492 fs/fx)普通のコードでも sse が使われて、結果 _a() より速くなる。 (なまじfv_a()のようなことすると、最適化した際に逆に遅くなる…orz)_b, _c は辛うじて速いけど、辛うじてってレベルの差でしかないので悲しい。
最適化コンパイルすると、手書きsseと大差無いsseコードが吐き出されるっぽいでした…。いい時代ですねorz
SSEが効果的なのは確かですが整数演算ですよね。
SSE だと理想的な場合でも float で4倍、double で2倍程度じゃないすか?10倍は何か他の要素があるんじゃないかと。
# AVX だとしても10倍はないような。
初めてAthlon64を買った時、oggencのi386とamd64のバイナリを用意して時間を測ったらamd64の方が2割くらい速かった覚えがあります。
以来、多少メモリを食われようがお構いなしにamd64にしています。
Intel Core2だと大差ないんでしたっけ?
SSE は 64bit には関係ないけど、パフォーマンスの話をするならレジスタ増える方かねぇ。
個人的には 2GB 超えるあたりで 64bit 化かな。メモリ、特にカーネルメモリとユーザメモリの割り当て自由度が 32bit と 64bit では雲泥の差がある。
ユーザー+カーネルメモリが 2GB+2GB とか 3GB+1GB とか構成考えなくていいのは、例え物理メモリが 2GB しか搭載されてなかったとしても、ある種のチューニング作業としてはかなり楽になる。
>SSE は 64bit には関係ないけど、パフォーマンスの話をするならレジスタ増える方かねぇ。
うんにゃAMD64ではSSE2が標準定義なので。
> SSE は 64bit には関係ないけど、AMD64の必須機能に含まれているので、存在を前提にできるという点が関係あります。自分でビルドできるんだからi386でもSSE有効でビルドすればいいじゃんとは思うけど。
じゃあ32bitでSSEが最強じゃん。
x32 ABI最強伝説
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
日々是ハック也 -- あるハードコアバイナリアン
そりゃあ (スコア:0)
メインメモリが4~8GB程度なら、64bitでのロスを考えるとx86にPAEでも良いけどさ
メモリ16~32GB積んでx86は無いでしょ、常識的に考えて…
しかし今や8GB DIMMですら5000円以下の時代だからね
そりゃあ今更x86とか使ってらんないよ
Re:そりゃあ (スコア:1)
メモリ量の64bitのロスより
x87 -> SSEによる浮動小数点演算の高速化のメリットのほうがでかいっす。
Apacheのhttps処理速度なんて10倍ぐらいでるもん。
Re:そりゃあ (スコア:2)
AES周りに専用の命令を使っていたってオチ?
Re:そりゃあ (スコア:1)
単純なコードで試した場合に、fpu と sse とで何倍くらいの差がでるのか試してみました。
(float型の3万個程度の配列の各要素を2乗する場合で、fpuとsseでどの程度の差がしょうじるか)
http://codepad.org/Ot3oQyRV [codepad.org]
fs() は、普通にループで普通に掛け算するだけです。
fv_a() は、掛け算を sse のに置き換えて、4個づつ計算してくようなの。(4倍速いはず?)
fv_b() は、32要素づつまとめて計算してくかんじの。(xmmレジスターは1個だけで使いまわし)
fv_c() は、fv_b()と同じだけど、xmmレジスターを無駄に8個全部使うかんじの。(xmmレジスターを沢山使うと逆に遅くなるかどうか)
それぞれを交互に1000回試して、各関数毎にトータルの所用時間をくらべてみました
gcc -O0 でコンパイルした場合 :
fs: 301437253 clock (1.000000 fs/fx)
fv_a: 87463181 clock (3.446447 fs/fx)
fv_b: 33049757 clock (9.120710 fs/fx)
fv_c: 33274995 clock (9.058972 fs/fx)
いちおう、ただsseに置き換えるだけで 3.5倍速くなって、もっとがんばると10倍くらい速くなってるみたいです、-O0ですが。
gcc -O3 でコンパイルしたばあい:
fs: 66715454 clock (1.000000 fs/fx)
fv_a: 31263297 clock (2.133987 fs/fx)
fv_b: 30580498 clock (2.181634 fs/fx)
fv_c: 29792373 clock (2.239347 fs/fx)
普通のコードが最適化で速くなって、sse との速度差が2倍程度にまで縮まる。
あと、sseの3種類の関数の速度差が悲しい程に縮まる。
gcc -O3 -msse2 でコンパイルした場合(悲しいお知らせ)
fs: 30884061 clock (1.000000 fs/fx)
fv_a: 33528261 clock (0.921135 fs/fx)
fv_b: 30616261 clock (1.008747 fs/fx)
fv_c: 29912155 clock (1.032492 fs/fx)
普通のコードでも sse が使われて、結果 _a() より速くなる。 (なまじfv_a()のようなことすると、最適化した際に逆に遅くなる…orz)
_b, _c は辛うじて速いけど、辛うじてってレベルの差でしかないので悲しい。
最適化コンパイルすると、手書きsseと大差無いsseコードが吐き出されるっぽいでした…。いい時代ですねorz
Re: (スコア:0)
Re: (スコア:0)
SSEが効果的なのは確かですが整数演算ですよね。
Re: (スコア:0)
SSE だと理想的な場合でも float で4倍、double で2倍程度じゃないすか?
10倍は何か他の要素があるんじゃないかと。
# AVX だとしても10倍はないような。
Re: (スコア:0)
初めてAthlon64を買った時、oggencのi386とamd64のバイナリを用意して時間を測ったらamd64の方が2割くらい速かった覚えがあります。
以来、多少メモリを食われようがお構いなしにamd64にしています。
Intel Core2だと大差ないんでしたっけ?
Re: (スコア:0)
SSE は 64bit には関係ないけど、パフォーマンスの話をするならレジスタ増える方かねぇ。
個人的には 2GB 超えるあたりで 64bit 化かな。
メモリ、特にカーネルメモリとユーザメモリの割り当て自由度が 32bit と 64bit では雲泥の差がある。
ユーザー+カーネルメモリが 2GB+2GB とか 3GB+1GB とか構成考えなくていいのは、
例え物理メモリが 2GB しか搭載されてなかったとしても、
ある種のチューニング作業としてはかなり楽になる。
Re:そりゃあ (スコア:2)
>SSE は 64bit には関係ないけど、パフォーマンスの話をするならレジスタ増える方かねぇ。
うんにゃAMD64ではSSE2が標準定義なので。
kusanagi shin
Re: (スコア:0)
> SSE は 64bit には関係ないけど、
AMD64の必須機能に含まれているので、存在を前提にできるという点が関係あります。
自分でビルドできるんだからi386でもSSE有効でビルドすればいいじゃんとは思うけど。
Re: (スコア:0)
じゃあ32bitでSSEが最強じゃん。
Re: (スコア:0)
x32 ABI最強伝説