2009-11-25 5 views
2

멀티 스레드 프로그램을 가지고 있다면, 각 스레드가 실행되는 코어 을 어떻게 알 수 있습니까?스레드가 실행되는 코어를 어떻게 알 수 있습니까? (Win XP에서)

C#에서 XP를이기는 다른 해결책이 있습니까?

나는이 시도 :

[DllImport("ntdll"), SuppressUnmanagedCodeSecurity] 
public static extern int NtGetCurrentProcessorNumber(); 

을 나는이 예외를 얻을 :

System.EntryPointNotFoundException이었다 처리되지 않은 메시지 = "DLL '의 ntdll에서'NtGetCurrentProcessorNumber '라는 진입 점을 찾을 수 없습니다 '. " = "XP_Multicore_try_0" 유형 이름 소스 = "" 스택 트레이스 : XP_Multicore_try_0.Program.NtGetCurrentProcessorNumber() 에서 XP_Multicore_try_0.Program.loop()에서 C에서 : \ 문서 및 프로그램 \ 설정 \ evyatarv \ 바탕 화면 \ XP_Multicore_try_0 \ XP_Multicore_try_0. CS : 라인 System.Threading.ThreadHelper.ThreadStart()에서 System.Threading.ThreadHelper.ThreadStart_Context (개체 상태) System.Threading.ExecutionContext.Run에서 (의 ExecutionContext의 ExecutionContext, ContextCallback 콜백 상태 개체)

감사합니다. Evyatar

답변

0

나는 좋은 방법이 있는지 확신하지 못합니다. Win32는 기존의 선호도 마스크를 반환하는 SetThreadAffinityMask() 함수를 제공하지만 .NET 스레드는 this question에 따라 운영 체제 스레드와 연결하는 것이 안전하지 않습니다.

+0

나는이 기능을 알고 있지만 테스트를 위해 사용하고 싶지 않다. – Evyatar

0

MSDN에 따르면 NtGetCurrentProcessorNumber은 변경되거나 향후 Windows 버전에서 사용할 수 없습니다. 응용 프로그램은 Kernel32.dll의 GetCurrentProcessorNumber 함수를 대신 사용해야합니다.

GetCurrentProcessorNumber()는 모든 Windows 버전에서 사용할 수있는 것은 아닙니다. Vista 이상, 또는 Windows Server 2003 이상에서 사용할 수 있습니다. 즉, XP에서 사용하려고해도 실패 할 것입니다.

API 호출을 사용하려면 먼저 설명서를 먼저 읽어야합니다. :-)

XP와 이전 버전에서 스레드가 실행될 코어 또는 프로세서를 확인하는 방법에 대해서는 알지 못합니다. 이것이 바로 Vista에서 시작하는 API에 GetProcessorNumber()를 추가 한 이유입니다.

+0

나는 API를 읽었다. (내가 여기에있다 .. :)) 고마워. – Evyatar

1

먼저 "핵심 번호"를 식별해야합니다. 각 코어에는 여러 개의 숫자가 연관되어 있습니다. 이 경우에는 코어의 OS 친 화성 인덱스를 의미한다고 가정합니다.

그런 경우 x86 CPU를 가정하면 (CPUID 명령을 사용하여) 코어의 APIC 번호를 가져온 다음이를 유사도 색인과 동등한 테이블의 인덱스로 사용할 수 있습니다.

당연히 등가물 테이블을 직접 작성해야합니다. 당신은 각 핵심 (친화력을 설정함으로써 친화 지수를 아는 것)과 그 APIC을 검색함으로써 그렇게 할 수 있습니다.

어떻게 C#에서 그렇게 할 것인지 모르겠다. 나는 C# 전문가가 아니다. 하지만 C 언어에서는 매우 쉽고 어셈블리에서는 훨씬 쉽습니다.

관련 문제