Witam,
pytanie jest takie jak w temacie postu. Potrzebuje uruchomić mój proces na wszystkich obecnych w komputerze procesorach logicznych. Mógłby ktoś dać jakieś wskazówki.
z góry dziękuje
Witam,
pytanie jest takie jak w temacie postu. Potrzebuje uruchomić mój proces na wszystkich obecnych w komputerze procesorach logicznych. Mógłby ktoś dać jakieś wskazówki.
z góry dziękuje
Odpalasz tyle wątków ile jest procesorów logicznych. Resztą zajmuje się automatycznie system operacyjny, wraz z ustaleniem, czy uruchamianie każdego wątka na osobnym rdzeniu to faktycznie dobry pomysł.
ja potrzebuje wyliczyć procesory. może uruchamianie jednego procesu na każdym kolejnym procesorze logicznym nie wygląda rozsądnie, ale ja potrzebuje odpytać każdy logiczny procesor instrukcją asm CPUID i potrzebne mi jest zrobić to "osobiście".
GNU/Linux ma takie narzędzia, możesz zajrzeć do kodu i bezczelnie skopiować.
jak nazywa sie taki tool. bo przeszukiwanie całego kodu linux jest raczej ostatecznością.
W Windows można to zrobić za pomocą SetThreadAffinityMask
. Ilość procesorów logicznych pobieram z systemu, ale nic nie stoi na przeszkodzie, żeby i to za pomocą cpuid
wyciągnąć.
#include <Windows.h>
#include <intrin.h>
#include <cstdio>
int main()
{
SYSTEM_INFO system_info;
GetSystemInfo(&system_info);
for(int i = 0; i < system_info.dwNumberOfProcessors; i++)
{
HANDLE thread = CreateThread(NULL, 0, [](LPVOID) -> DWORD
{
// Dla procesorów Intel:
// Each logical processor in an Intel 64 or IA-32 platform supporting coherent memory is assigned a unique ID (APIC ID) within the coherent domain.
int data[4];
__cpuid(data, 1);
printf("APIC ID: %d\n", (data[1] >> 24));
return 0;
}, NULL, CREATE_SUSPENDED, NULL);
DWORD_PTR affinity = 1 << i;
SetThreadAffinityMask(thread, affinity);
ResumeThread(thread);
WaitForSingleObject(thread, INFINITE);
}
}
dzięki wszystkim za pomoc. Rev - o to chodziło.