|
>1. SetThreadAffinityMask() の mask フラグについて
>SetThreadAffinityMask() の第2パラメータはビットフラグで扱うのではないかと思うのですが、所々、数値で表されているように見えます(cpuinfo.cpp の実装辺り)。2 processor の場合、問題は無いと思うのですが、4 processor 以上の場合、意味合いが異なる気がします。
for( i = 1; i <= Number; i++ ){
#ifdef _WIN32
DWORD mask;
if( IsNT() ){
mask = (DWORD)SetThreadAffinityMask(GetCurrentThread(),i);
if( i >= 2 ){
Sleep(DualWaitTime);
}
#endif
上の部分ですよね。
mask = (DWORD)SetThreadAffinityMask(GetCurrentThread(),1<<(i-1));
が、正解ではないかと思います。
結果論ですが2プロセッサまでは結果同一、それに加えて
3プロセッサ以上で使用している人が殆どいなかった事が、そのまま残った理由かと思います。(どっかで見たコードも同じだった記憶があります。)
>2. SetProcessAffinityMask()/GetProcessAffinityMask() を使用しない理由について
>何か理由があって SetProcessAffinityMask() を使用していないのであれば理由を教えていただけないでしょうか。
特定プロセッサ・リソース(TSC/MSR etc)の取得/変更が主目的と思われますので、どちらを
使っても大差無いと思いますが...
逆にSetProcessAffinityMask()/GetProcessAffinityMask()を使った場合の利点はなんでしょうか?
瞬間的なプロセッサの変更が主目的の場合、ProcessよりもSetThread変更程度に留めて
おいた方がオーバーヘッドが小さいような気がしますが どうでしょう?
ソフトの性格上”マルチプロセッサでのパフォーマンスを追求”と言った事が趣旨ではない
と思われますので、結局の処 どちらでも変わりないと思います。
---
後は、作者の方のお考えを伺いましょう。
|
|