Как Обнаружить Количество Физических процессоров / Ядра в Windows, Mac и Linux

У меня есть многопоточное приложение C++, которое работает на Windows, Mac и нескольких разновидностях Linux.

Короче говоря: Для него для выполнения с максимальной производительностью я должен смочь инстанцировать единственного потока на физический процессор / ядро. При создании большего количества потоков, чем существуют физические процессоры/ядра, ухудшает производительность моей программы значительно. Я могу уже правильно обнаружить количество логических процессоров/ядер правильно на всех трех из этих платформ. Чтобы смочь обнаружить количество физических процессоров/ядер правильно, я должен буду обнаружить, если гиперпоступь поддерживается И активна.

Мой вопрос поэтому состоит в том, если существует способ обнаружить, поддерживается ли Поточная обработка Hyper и включается? Если так, как точно.

44
задан Royi 7 October 2019 в 07:49
поделиться

1 ответ

В 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 мог бы помочь.

0
ответ дан 26 November 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: