5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

【糞】Pentium4最適化への道

1 :DX4Inside:02/07/11 12:05
Pentium4 が糞なのはわかってる。

技術者ならば、糞だ糞だと言う前にどうすればその能力を
引き出せるのか考えるべき

みんなで一緒に考えましょう

関連URL : http://www.intel.co.jp/jp/developer/design/pentium4/manuals/index.htm

俺の意見 : cmov 使え


2 :デフォルトの名無しさん:02/07/11 12:07
i486SXサイコー

3 :デフォルトの名無しさん:02/07/11 12:11
80x86ってのはモード切り替えが多目。そのかわりデバッガは無し。これ
で、そいつをロジアナでトレース。これ最強
素人にはお勧めできない

4 :デフォルトの名無しさん:02/07/11 13:33
とりあえずWindowsには決定的に向かないのでやめよう。


5 :デフォルトの名無しさん:02/07/11 15:34
x86は死の呪文(ザキ)です。
口にしてはいけません。

6 :デフォルトの名無しさん:02/07/11 15:42
>>1
ま、cmovはうまく使わないとな。
分岐予測が外れやすいところで、使うと効果的。
分岐予測が当たりやすいところで使うと、かえって遅くなる。

cmovはフラグの値が確定するまで待ち状態になる。
分岐はフラグの値が確定していなくても、予測して処理を進める。

7 :デフォルトの名無しさん:02/07/11 17:49
VC6のコンパイラオプションなんだけどさ、

/GB [ブレンド]
Pentium 用に作成されたコードを最適化します。
 80386 (/G3)、80486 (/G4)、Pentium (/G5)、および Pentium Pro (/G6)
 オプションの最適化をブレンドします。このオプションは、_M_IX86 プリプ
 ロセッサ マクロに対して値 500 を使用します。これは、デフォルトの値で
 す。コンパイラの今後のバージョンでは、主流のプロセッサに合わせて別の
 値を使用する予定です。

これって.NETになって拡張されてるの?
Pentium4向けのオプションとかあってもよさそうなものだが。

8 :DX4Inside:02/07/11 19:37
<<< テストコード >>>

; Jccバージョン
cmp dword [ebp], 0
jle .continue
or [ebx], byte 1
.continue

; CMOVccバージョン
xor ecx,ecx
cmp dword [ebp], 0
cmovg ecx, eax
or [ebx], ecx

<<<< 65535回行ったときの計測結果 >>>>

[ebp]の値が常に正の場合 Jccバージョンの方が速い
[ebp]の値が常に負の場合 Jccバージョンの方が速い
[ebp]の値が正負混ざる場合 CMOVccバージョンの方が速い

<<< 結論 >>>>
CMOVは分岐予測が外れやすいところで使うべし




9 :DX4Inside:02/07/11 20:19
>>7

cl.exe の最適化オプション

/G3 80386 用に最適化する
/G4 80486 用の最適化を行う
/G5 Pentium 用に最適化する
/G6 PPro、P-II、P-III 用に最適化する
/GB ブレンドの最適化を行う (既定)

... という感じで拡張されていないのでは?

Intelのコンパイラでは /G7 オプションがあって
Pentium4をターゲットにした最適化できます。

ttp://www.intel.co.jp/jp/developer/software/products/compilers/c60/index.htm





10 :デフォルトの名無しさん:02/07/11 21:07
vc.netの/GBは600

11 :デフォルトの名無しさん:02/07/12 21:05
>>8
おもしろいねそれ。
true/falseがある確率でランダムに出るとして、
速度が同じになるのはどれくらいの偏りのときだろう。

12 :デフォルトの名無しさん:02/07/14 10:08
デノーマル数の演算ってめちゃくちゃ遅いんだね。
Pen4で、普通なら6クロックで終わる浮動小数点乗算が
デノーマル数だと1000クロック以上かかる。
せいぜい数10クロック程度だろうと思ってた。

#include <iostream>
using namespace std;
void main() {
 float a=1.0e-40; // a=1.0;
 float b=0.99;
 int clks;
 __asm {
  movss xmm0,a
  movss xmm1,b
  mov ecx,1000
  rdtsc
  neg eax
  mov clks,eax
 repeat:
  mulss xmm0,xmm1
  sub ecx,1
  jne repeat
  rdtsc
  add clks,eax
  movss a,xmm0
 }
 cout << clks / 1000.0 << " clocks" << endl;
 cout << "value = " << a << endl;
}

初期値 a=1.0e-40(デノーマル数)の場合の結果:
1224.15 clocks
value = 7.00649e-044

初期値を a=1.0 にした場合の結果:
6.096 clocks
value = 4.31717e-005

初期値 a=1.0e-40(デノーマル数)で、最初に
__asm {
 sub esp,4
 stmxcsr [esp]
 or dword ptr [esp],0x00008800
 ldmxcsr [esp]
 add esp,4
}
を追加してゼロ・フラッシュ・モードで実行した場合の結果:
7.404 clocks
value = 0

5 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)