アカウント名:
パスワード:
メインメモリが4~8GB程度なら、64bitでのロスを考えるとx86にPAEでも良いけどさメモリ16~32GB積んでx86は無いでしょ、常識的に考えて…しかし今や8GB DIMMですら5000円以下の時代だからねそりゃあ今更x86とか使ってらんないよ
メモリ量の64bitのロスよりx87 -> SSEによる浮動小数点演算の高速化のメリットのほうがでかいっす。
Apacheのhttps処理速度なんて10倍ぐらいでるもん。
単純なコードで試した場合に、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
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
コンピュータは旧約聖書の神に似ている、規則は多く、慈悲は無い -- Joseph Campbell
そりゃあ (スコア:0)
メインメモリが4~8GB程度なら、64bitでのロスを考えるとx86にPAEでも良いけどさ
メモリ16~32GB積んでx86は無いでしょ、常識的に考えて…
しかし今や8GB DIMMですら5000円以下の時代だからね
そりゃあ今更x86とか使ってらんないよ
Re: (スコア:1)
メモリ量の64bitのロスより
x87 -> SSEによる浮動小数点演算の高速化のメリットのほうがでかいっす。
Apacheのhttps処理速度なんて10倍ぐらいでるもん。
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