Ira Baxterの回答で示唆したように、CPUキャッシュはマルチコアシステムでも役割を果たします。次のテストコードを検討してください。
危険はロビソンになります!
次のコードは、より一貫性のある結果を達成するためにリアルタイムへの優先順位を上げます-これには管理者権限が必要ですが、デュアルコアまたはシングルコアシステムでコードを実行する場合は、テスト実行中にマシンがロックされるため、注意してください。
#include <windows.h>
#include <stdio.h>
const int RUNFOR = 5000;
volatile bool terminating = false;
volatile int value;
static DWORD WINAPI CountErrors(LPVOID parm)
{
int errors = 0;
while(!terminating)
{
value = (int) parm;
if(value != (int) parm)
errors++;
}
printf("\tThread %08X: %d errors\n", parm, errors);
return 0;
}
static void RunTest(int affinity1, int affinity2)
{
terminating = false;
DWORD dummy;
HANDLE t1 = CreateThread(0, 0, CountErrors, (void*)0x1000, CREATE_SUSPENDED, &dummy);
HANDLE t2 = CreateThread(0, 0, CountErrors, (void*)0x2000, CREATE_SUSPENDED, &dummy);
SetThreadAffinityMask(t1, affinity1);
SetThreadAffinityMask(t2, affinity2);
ResumeThread(t1);
ResumeThread(t2);
printf("Running test for %d milliseconds with affinity %d and %d\n", RUNFOR, affinity1, affinity2);
Sleep(RUNFOR);
terminating = true;
Sleep(100); // let threads have a chance of picking up the "terminating" flag.
}
int main()
{
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
RunTest(1, 2); // core 1 & 2
RunTest(1, 4); // core 1 & 3
RunTest(4, 8); // core 3 & 4
RunTest(1, 8); // core 1 & 4
}
私のクアッドコアIntelQ6600システム(iircには2セットのコアがあり、各セットがL2キャッシュを共有します-とにかく結果を説明します;))では、次の結果が得られます。
アフィニティ1および2で5000ミリ秒のテストを実行
スレッド00002000:351883エラー
スレッド00001000:343523エラー
アフィニティ1および4で5000ミリ秒のテストを実行
スレッド00001000:48073エラー
スレッド00002000:59813エラー
アフィニティ4および8で5000ミリ秒のテストを実行
スレッド00002000:337199エラー
スレッド00001000:335467エラー
アフィニティ1および8で5000ミリ秒のテストを実行
スレッド00001000:55736エラー
スレッド00002000:72441エラー