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

Попробуйте это

=SUMPRODUCT(--(LEFT(A1:A100,3)=LEFT(A1,3)))
44
задан Royi 7 October 2019 в 07:49
поделиться

4 ответа

В 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
поделиться

Решение только для Windows, описанное здесь:

GetLogicalProcessorInformation

для linux, файл /proc/cpuinfo. Я не работаю под linux сейчас, поэтому не могу дать вам более подробную информацию. Вы можете подсчитать физические/логические экземпляры процессоров. Если количество логических в два раза больше физических, то у вас включен HT (верно только для x86).

15
ответ дан 26 November 2019 в 22:01
поделиться

Я не знаю, что все три предоставляют информацию одинаково, но если вы можете с уверенностью предположить, что ядро ​​NT будет сообщать информацию об устройстве в соответствии со стандартом POSIX (который NT предположительно поддерживает), тогда вы можете работать с этим стандартом.

Тем не менее, различия в управлении устройствами часто упоминаются как один из камней преткновения на пути кроссплатформенной разработки. В лучшем случае я бы реализовал это в виде трех логических цепочек, я бы не пытался написать один фрагмент кода для равномерного управления всеми платформами.

Хорошо, все, что предполагает C ++. Что касается ASM, я полагаю, вы будете работать только на процессорах x86 или amd64? Вам по-прежнему понадобятся два пути ветвления, по одному для каждой архитектуры, и вам нужно будет тестировать Intel отдельно от AMD (IIRC), но в целом вы просто проверяете CPUID. Это то, что вы пытаетесь найти? CPUID из ASM на процессорах семейства Intel / AMD?

0
ответ дан 26 November 2019 в 22:01
поделиться

Обратите внимание на это, здесь указано не количество физических ядер, как задумано, а количество логических ядер.

Если вы можете использовать C ++ 11 (спасибо комментарию alfC ниже):

#include <iostream>
#include <thread>

int main() {
    std::cout << std::thread::hardware_concurrency() << std::endl;
    return 0;
}

В противном случае, возможно, вам подойдет библиотека Boost. Тот же код, но другой, как указано выше. Включите вместо .

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

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