SetThreadAffinityMask関数のメモ
http://msdn.microsoft.com/ja-jp/library/cc429346.aspx におけるSetThreadAffinityMask 関数の説明によれば,
DWORD SetThreadAffinityMask ( HANDLE hThread, // 操作対象スレッドのハンドル DWORD dwThreadAffinityMask // スレッドアフィニティマスク );
であり,
スレッドアフィニティマスクはビットベクトルであり、各ビットはそのスレッドを実行できるプロセッサを表します。
とある.
例として,利用可能なcpuコア番号が0,1,2・・・のとき,
SetThreadAffinityMask(GetCurrentThread(), 0x00000001); // 現在のスレッドを0番目のコアに固定 SetThreadAffinityMask(GetCurrentThread(), 0x00000002); // 現在のスレッドを1番目のコアに固定
のようになる.スレッドアフィニティマスクの指定の仕方は,
0x00000001 // (コア0が有効: 0b0001) 0x00000002 // (コア1が有効: 0b0010) 0x00000003 // (コア1,0が有効: 0b0011) 0x00000004 // (コア2が有効: 0b0100) ...
とするようだ.(cpuに対応したビットを立てる)
dwThreadAffinityMask が DWORD型(32bit)なので,この方法だと33コア以上は扱えない様子.
参考
- Windows Data Types (Windows), http://msdn.microsoft.com/en-us/library/aa383751(VS.85).aspx
- affinity mask Option, http://msdn.microsoft.com/en-us/library/ms187104(SQL.90).aspx