0

私はベンチマーク プログラムを書いています。私が望むのは、異なるコアでスレッドを次々と実行することです。たとえば、コア 0 だけで作業を実行し、次にコア 0、1、コア 0、1、2、3、そして 0、1、2、3、4、5、6、7 (マシンには 8 つのコアがあります)。に渡す必要がある 2 番目のパラメーターについて混乱していますSetThreadAffinityMask()

10進数または16進数のいずれかを渡すことができます。16 進数では、次を渡すことができます。

0x0001 for core 0,
0x0003 for cores 0,1,
0x000F for cores 0,1,2,3

しかし、これらの値を動的に作成する方法を見つけるのに苦労しています。基本的に、特定の数のコアに対して、その数までのすべてのコアにアフィニティを設定するには、16 進値を取得できる必要があります。どこから始めればよいかについての助けは素晴らしいでしょう。

4

2 に答える 2

2

「N までのすべてのコア (N を含まない)」には、マスク値 2 N - 1 が必要なので、次のようになります。

(static_cast<DWORD_PTR>(1) << N) - 1;
于 2013-07-26T13:32:16.347 に答える
1

ビット値は1 << core_number. したがって、次のようなものがある場合:

vector<int> cpus_to_use = { 1, 3, 9, 11 }; 

次に、次の方法でアフィニティ マスクを作成できます。

int mask = 0;
for( i : cpus_to_use) 
    mask |= 1 << i; 

すべてのビットを設定するだけの場合は、(1 << num_cores) - 1ビットがnum_cores設定されます。

于 2013-07-26T13:33:16.573 に答える