У меня есть многопоточное приложение C++, которое работает на Windows, Mac и нескольких разновидностях Linux.
Короче говоря: Для него для выполнения с максимальной производительностью я должен смочь инстанцировать единственного потока на физический процессор / ядро. При создании большего количества потоков, чем существуют физические процессоры/ядра, ухудшает производительность моей программы значительно. Я могу уже правильно обнаружить количество логических процессоров/ядер правильно на всех трех из этих платформ. Чтобы смочь обнаружить количество физических процессоров/ядер правильно, я должен буду обнаружить, если гиперпоступь поддерживается И активна.
Мой вопрос поэтому состоит в том, если существует способ обнаружить, поддерживается ли Поточная обработка Hyper и включается? Если так, как точно.
В Windows, существуют GetLogicalProcessorInformation
и GetLogicalProcessorInformationEx
доступны для Windows XP SP3 или более старого и Windows 7 + соответственно. Различие - то, что GetLogicalProcessorInformation не поддерживает установки больше чем с 64 логическими ядрами, которые могли бы быть важны для установок сервера, но можно всегда отступать к GetLogicalProcessorInformation
, если Вы находитесь на XP. Использование в качестве примера для GetLogicalProcessorInformationEx
( источник ):
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX buffer = NULL;
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX ptr = NULL;
BOOL rc;
DWORD length = 0;
DWORD offset = 0;
DWORD ncpus = 0;
DWORD prev_processor_info_size = 0;
for (;;) {
rc = psutil_GetLogicalProcessorInformationEx(
RelationAll, buffer, &length);
if (rc == FALSE) {
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
if (buffer) {
free(buffer);
}
buffer = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX)malloc(length);
if (NULL == buffer) {
return NULL;
}
}
else {
goto return_none;
}
}
else {
break;
}
}
ptr = buffer;
while (offset < length) {
// Advance ptr by the size of the previous
// SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX struct.
ptr = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX*)\
(((char*)ptr) + prev_processor_info_size);
if (ptr->Relationship == RelationProcessorCore) {
ncpus += 1;
}
// When offset == length, we've reached the last processor
// info struct in the buffer.
offset += ptr->Size;
prev_processor_info_size = ptr->Size;
}
free(buffer);
if (ncpus != 0) {
return ncpus;
}
else {
return NULL;
}
return_none:
if (buffer != NULL)
free(buffer);
return NULL;
На Linux, анализируя /proc/cpuinfo
мог бы помочь.