2011-05-07 9 views
6

12 개의 코어와 12 개의 스레드가 실행 중입니다. 각 코어에 1 개의 스레드를 바인딩하고 싶습니다. 이것은 각 스레드의 시작 부분에서 호출하는 것입니다.SetThreadAffinityMask의 올바른 사용

int core=12; 
SetThreadAffinityMask(GetCurrentThread(),(1<<core)-1); 

이 내가이 그것을 호출 할 적절한 방법이 될 것인지 몰라요 ...이 것입니다. 두 번째 매개 변수가 작동하는 방식을 이해하고 있는지 확실하지 않습니다.

SetProcessaffinitymask도 호출해야합니까?

답변

7

SetThreadAffinityMask()의 두 번째 매개 변수는 비트 벡터입니다. 각 비트는 논리 프로세서 인 CPU 코어 또는 하이퍼 스레드에 해당합니다. 두 번째 매개 변수의 비트가 1로 설정된 경우 스레드는 해당 코어에서 실행될 수 있습니다.

core이 12 일 경우 (1<<core)-1 마스크는 0.11 비트 세트를 포함하므로 모든 스레드가 12 코어 중 하나에서 실행될 수 있습니다. 아마도 각 스레드가 전용 코어에서 실행되도록 설정하려고했을 것입니다. 이를 위해 각 스레드는 0과 11 사이의 고유 번호를 가지며 선호도 마스크의 해당 비트만 설정해야합니다. 힌트 : InterlockedIncrement()을 사용하면 고유 번호를 얻을 수 있습니다. 또는 스레드가 모두 루프에서 시작된 경우 고유 번호가 이미 알려져 있습니다 (루프 이동 횟수입니다). 각 스레드에 인수로 전달하거나 동일한 루프에서 새 스레드에 대한 선호도를 설정하십시오.

David Heffernan의 답변에주의하십시오. 친화력을 사용하는 방법을 알지 못하면 선호도를 사용하지 않는 것이 좋습니다. David가 이미 언급 한 이유 외에도 소켓, 코어 및 하이퍼 스레드 수가 다른 컴퓨터간에 응용 프로그램 이식성을 추가 할 것입니다.

+0

일반적으로 메인 스레드 설정 선호도를 루프하여 연동시킬 필요가 없습니다. –

+0

@David : 네, 그 역시 옵션입니다.나는 대답에 덧붙일 것이다. –

+0

(1 << core) -1은 12 비트 세트입니다. – Jake

7

당신이 의도하지 않은 모든 12 개의 프로세서에 선호도를 설정하는 것처럼 보입니다.

메인 스레드에서 12 개의 스레드 모두에 걸쳐 루프를 설정하면 연관성을 설정합니다. 스레드는 스레드가 알고 있어야 할 필요가없는 인덱스를 알아야하기 때문에 스레드 내부의 선호도를 설정하지 마십시오. 마스크 변수를 선언하고 값 1을 지정합니다. 루프를 돌릴 때마다 스레드 선호도를 설정 한 다음 1 씩 이동합니다. 프로세스 선호도는 변경하면 안됩니다.

주의 사항. 친화력을 설정하는 것은 위험합니다. 사용자가 프로세스 선호도를 변경하면 임의의 프로세서에서 실행할 수없는 스레드가 생길 수 있습니다. 조심해.

또한 수동으로 선호도를 설정하면 성능상의 이점이없고 때로는 속도가 느린 것이 제 경험입니다. 보통 시스템은 훌륭하게 작동합니다.

+0

주 함수에서 스레드 선호도는 어떻게 설정합니까? 스레드 함수의 시작 부분에>,>를 설정했습니다. 첫 번째 매개 변수는 스레드 핸들이 필요합니다 ... 나는 단지 GetCurrentThread()를 호출 할 수 있습니다. 메인 함수에서 핸들을 가져 오는 또 다른 함수가 있습니까? – Jake

+0

nevermind 알아 냈습니다. 감사합니다. – Jake

4

다음과 같은 코드를 작성할 수 있습니다. GetThreadHandle (i)는 각 스레드의 핸들을 가져 오는 함수입니다.

int core = 12; 
for(int i=0; i<core; i++) 
    SetThreadAffinityMask(GetThreadHandle(i), 1<<i); 
0

비트 마스크는 일반적으로 64 비트입니다. 32 개 이상의 프로세서가있는 경우 산술 오버플로를 방지하는 더 이식 가능한 솔루션은 다음과 같습니다.

auto mask = (static_cast<DWORD_PTR>(1) << core);//core number starts from 0 
auto ret = SetThreadAffinityMask(GetCurrentThread(), mask);