Windows 2000 Advanced ServerでCore i7の性能を引き出してみる実験
どうも、Core i7 で Hyper Threading Technology(HTT)を有効にすると、VistaやXPでも 性能が落っこちると言う記事を余りにも見るので、とある実験をしてみることにしました。
実験に使うのは最大4スレッドしか使わないと言う CrystalMark 2004R3 です
Core i7の場合CPU0~7が割り当てられていますが、実際どのCPUがどのHTTなのかよく分かりません。
まず、これが標準状態です。
| CrystalMark | 138942 |
| ALU | 45409 |
| Fibonacci | 16866 |
| Napierian | 11726 |
| Eratosthenes | 5645 |
| QuickSort | 11150 |
| FPU | 52185 |
| MikoFPU | 5430 |
| RandMeanSS | 30553 |
| FFT | 8084 |
| Mandelbrot | 8096 |
| MEM | 41348 |
| Read | 17285.93 MB/s ( 17285 ) |
| Write | 7969.49 MB/s ( 7969 ) |
| Read/Write | 7860.45 MB/s ( 7860 ) |
| Cache | 82124.14 MB/s ( 8212 ) |

次に、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NDIS\Parameters にある ProcessorAffinityMask の値を 0x55にしてみました。要するに偶数番のCPUを優先的に使うわけです。
| CrystalMark | 128809 |
| ALU | 41909 |
| Fibonacci | 15101 |
| Napierian | 11251 |
| Eratosthenes | 5402 |
| QuickSort | 10133 |
| FPU | 47599 |
| MikoFPU | 5430 |
| RandMeanSS | 26612 |
| FFT | 7714 |
| Mandelbrot | 7821 |
| MEM | 39301 |
| Read | 15085.90 MB/s ( 15085 ) |
| Write | 8013.80 MB/s ( 8013 ) |
| Read/Write | 7982.05 MB/s ( 7982 ) |
| Cache | 81991.49 MB/s ( 8199 ) |
ベンチマークの結果がた落ちです。恐らくCPU0とCPU4と言う具合に4番飛ばしでHTTペアになっているのでしょう。

ProcessorAffinityMaskを0xf0にしてみました。
HTTの片方を使う設定です。
| CrystalMark | 138863 |
| ALU | 47927 |
| Fibonacci | 20043 |
| Napierian | 11176 |
| Eratosthenes | 5645 |
| QuickSort | 11041 |
| FPU | 51424 |
| MikoFPU | 5430 |
| RandMeanSS | 30385 |
| FFT | 7734 |
| Mandelbrot | 7853 |
| MEM | 39512 |
| Read | 16107.58 MB/s ( 16107 ) |
| Write | 8055.21 MB/s ( 8055 ) |
| Read/Write | 7935.97 MB/s ( 7935 ) |
| Cache | 73935.78 MB/s ( 7393 ) |
設定していないときよりも明らかに性能UPです!

では、完全にCPU0,2,4,6しか使わないようにしたらどうなるか、やってみましょう。
| CrystalMark | 105438 |
| ALU | 34730 |
| Fibonacci | 11697 |
| Napierian | 9411 |
| Eratosthenes | 4996 |
| QuickSort | 8604 |
| FPU | 39472 |
| MikoFPU | 5420 |
| RandMeanSS | 19914 |
| FFT | 7358 |
| Mandelbrot | 6758 |
| MEM | 31236 |
| Read | 10518.73 MB/s ( 10518 ) |
| Write | 7769.78 MB/s ( 7769 ) |
| Read/Write | 6711.58 MB/s ( 6711 ) |
| Cache | 62163.35 MB/s ( 6216 ) |
うわ、もうがたがたですね。

最後にHTTを使わない設定です。

| CrystalMark | 155237 |
| ALU | 51566 |
| Fibonacci | 20208 |
| Napierian | 12530 |
| Eratosthenes | 6211 |
| QuickSort | 12595 |
| FPU | 58852 |
| MikoFPU | 5419 |
| RandMeanSS | 36228 |
| FFT | 8853 |
| Mandelbrot | 8330 |
| MEM | 44819 |
| Read | 17201.80 MB/s ( 17201 ) |
| Write | 8018.07 MB/s ( 8018 ) |
| Read/Write | 7867.77 MB/s ( 7867 ) |
| Cache | 117117.96 MB/s ( 11711 ) |
格段に結果が向上しました。

以前の結果と比べていただければ分かるように、約20%もCPUのベンチ部分が高速になりました!
スコアは 239316 です。
CPUが少ないときは2スレッド使い切ることが多いわけですが、Core i7になって、CPUが増えると、HTTを使用している場合、遊んでいるCPUが出てきてしまい、全体的にパフォーマンスが落ちることがあるというのは本当のようです。
性能比較
2CPU+HTTに限定<ProcessorAffinityMask に0x55もしくは0xAAを設定<デフォルトの設定<ProcessorAffinityMask に0xf0もしくは0x0fを設定<4CPUHTTなしに限定
こういうことですね。
利用するCPUが固定ならば、IMAGECFG.EXEなどを使用して使うCPUを限定してしまうと言う方法も よいかもしれませんね。
CPUをフルに8スレッド使い切るアプリケーションを使わないのならば 少なくとも、ProcessorAffinityMask を設定しておいた方がよさそうです。
同時にアプリケーションをそんなにたくさん起動しない場合は、もう、HTTを完全に無効にしてしまう方が良いかもしれませんね(^^;
というわけで、勿論4スレッドのCPUにもある程度これは言えそうで、atom のデュアルコア辺りなら、HTTを無効にしてProfessionalで使った方が却ってよいかもしれません。
HTTは1CPU(1コア)で使わないと、Windows2000を含め、XPやVistaでもその能力を発揮するのは普通の利用では難しいようです。
関連記事:
Windows 2000をマルチコアで最適化する
Hyper Threading Technology の足枷?
関連リンク:
プログラムの実行に使用するCPUを限定させる - @IT
Windows Server 2003、Windows 2000 Server、または Windows NT 4.0 実行しているコンピュータで複数のプロセッサのプロセッサの負荷が分散できません。


“関連記事:
Windows 2000をマルチコアで最適化する”
のリンク先をミスしてまする
ありがとうございます。
他も狂ってたので修正しました。