|
これは実に難しい問題です...
ライダーさんが C 言語の心得があるかはわかりませんが、こんな感じのコードになっています。
Memory Read
------------------------------------------------------------
DWORD *memory = new DWORD[MemSize / 4];
DWORD LoopLimit = MemSize / 4;
DWORD count = 0;
for(;FlagLoop;){
_asm{
ALIGN 4
mov ebx,memory
mov ecx,LoopLimit
test ecx,ecx
jz exit
iter:
mov eax, DWORD PTR [ebx+ecx*4-4] ;; U-1
dec ecx ;; V-1
jnz iter ;; U-2
add count,1
}
}
delete [] memory;
--------------------------------------------
大体ですけど。FlagLoop は外部のスレッドが一定時間経過後変更します。
もっと良いコードがあるような気がしないでもないのですが...
あと、Cache 測定は
_asm cld;
for(;FlagLoop;){
_asm{
ALIGN 8
add count,1
mov edi,memory ;測定用配列ポインタ
mov ecx,LoopLimit ;転送回数
rep stosd;
}
}
って感じです。ASM がわからない方にはなんとことかサッパリかもしれませんが。
結局のところどのようなコードで測定するかが非常に重要になってくるわけです。ただ、AMD の CPU は TwinBank にしても CPU 自体は DDR なので DDR266 とそれだけでマッチするわけで、オンボードビデオとかやらない場合はあんまり効果はないのかも知れません...(当然未確認発言です)
他のベンチも色々試してみて結果を教えていただけると大変参考になります。
|
|