15

Windows 7 64ビットでのみベンチマークを行うには、さまざまなc /c++プロセスをマシンの特定のコアに固定する必要があります。私のマシンには16コア(2x8)があります。特定のプロセスのコード内からSetProcessAffinityMaskを呼び出して、これを実行しようとしています。それが正しいと仮定すると、この関数をどのように正確に使用するかがわかりません。ドキュメントを見ましたが、2番目の引数が何である必要があるかについての説明を理解できません。また、SOまたはGoogleで検索したc /c++の使用例も見つかりませんでした。

質問1:16コアマシン(2cpux8)を例にとり、ac / c ++プロジェクトを取り上げて、SetProcessAffinityMaskを使用して16コアのそれぞれを選択する方法の実例と、私の理解のための2番目の引数の説明を提供してください。コアIDを0〜15から同等のビットマスクに変換するにはどうすればよいですか?

質問2:1つのCPUに16コアではなく、2x8コアがある場合、使用法に違いはありますか?それとも同じ使い方ですか?

どうもありがとう。これが私がこれまでに持っているものです。

#include <Windows.h>
#include <iostream>

using namespace std;

int main () {

    HANDLE process = GetCurrentProcess();

    DWORD_PTR processAffinityMask = 0; /// What to do here?

    BOOL success = SetProcessAffinityMask(process, processAffinityMask);

    cout << success << endl;

    return 0;

}
4

2 に答える 2

16

2番目のパラメーターはビットマスクです。ここで、設定されたビットはプロセスがそのプロセッサーで実行できることを意味し、明確なビットは実行できないことを意味します。

あなたの場合、各プロセスを別々のコアで実行するには、(1つの可能性として)各プロセスに番号を与えるコマンドライン引数を渡し、プロセス内でその番号を使用して、使用するプロセッサを決定できます。

#include <Windows.h>
#include <iostream>

using namespace std;

int main (int argc, char **argv) {
    HANDLE process = GetCurrentProcess();
    DWORD_PTR processAffinityMask = 1 << atoi(argv[1]);

    BOOL success = SetProcessAffinityMask(process, processAffinityMask);

    cout << success << endl;
    return 0;
}

次に、次のようなものでこれを実行します。

for %c in (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15) do test %c
于 2012-10-09T15:45:46.427 に答える
3

すでに述べたように、それはビットマスクです。プロセスまたはシステムがまだすべてのコアにアクセスできない場合に備えて、GetProcessAffinityMaskの結果を使用することをお勧めします。これが私が思いついたものです。

#include <Windows.h>
#include <iostream>
using namespace std; 
 
int main () { 
 
    HANDLE process = GetCurrentProcess(); 
 
    DWORD_PTR processAffinityMask;
    DWORD_PTR systemAffinityMask;

    if (!GetProcessAffinityMask(process, &processAffinityMask, &systemAffinityMask))
        return -1;

    int core = 2; /* set this to the core you want your process to run on */
    DWORD_PTR mask=0x1;
    for (int bit=0, currentCore=1; bit < 64; bit++)
    {
        if (mask & processAffinityMask)
        {
            if (currentCore != core)
            {
                processAffinityMask &= ~mask;
            } else
            {
                if ( !(systemAffinityMask & mask) )
                {
                    cerr << "Core " << core << " not enabled in system." << endl;
                }
            }
            currentCore++;
        }
        mask = mask << 1;
    }

    BOOL success = SetProcessAffinityMask(process, processAffinityMask & systemAffinityMask); 
 
    cout << success << endl; 
 
    return 0; 
 
} 
于 2012-10-09T16:05:02.607 に答える