Программно найти количество ядер на машине

Он называется привязкой к троекрату или цепочке конструкторов Teleescoping Constructor. Да, вы можете это сделать. Я вижу много примеров выше, и я хочу добавить, сказав, что если вы знаете, что вам нужен только два или три конструктора, возможно, все в порядке. Но если вам нужно больше, попробуйте использовать другой шаблон дизайна, такой как шаблон Builder. Например:

 public Omar(){};
 public Omar(a){};
 public Omar(a,b){};
 public Omar(a,b,c){};
 public Omar(a,b,c,d){};
 ...

Вам может потребоваться больше. В этом случае лучшим вариантом будет шаблон Builder. Вот статья, может быть полезно https://medium.com/@modestofiguereo/design-patterns-2-the-builder-pattern-and-the-telescoping-constructor-anti-pattern-60a33de7522e

436
задан Tshepang 4 January 2015 в 19:16
поделиться

14 ответов

C++ 11

//may return 0 when not able to detect
unsigned concurentThreadsSupported = std::thread::hardware_concurrency();

Ссылка: станд.:: поток:: <час> hardware_concurrency

В C++ до C++ 11, нет никакого портативного пути. Вместо этого необходимо будет использовать один или несколько следующих методов (охраняемый соответствующим #ifdef строки):

  • Win32

    SYSTEM_INFO sysinfo;
    GetSystemInfo(&sysinfo);
    int numCPU = sysinfo.dwNumberOfProcessors;
    
  • Linux, Солярис, AIX и Mac OS X> =10.4 (т.е. Tiger вперед)

    int numCPU = sysconf(_SC_NPROCESSORS_ONLN);
    
  • FreeBSD, MacOS X, NetBSD, OpenBSD, и т.д.

    int mib[4];
    int numCPU;
    std::size_t len = sizeof(numCPU); 
    
    /* set the mib for hw.ncpu */
    mib[0] = CTL_HW;
    mib[1] = HW_AVAILCPU;  // alternatively, try HW_NCPU;
    
    /* get the number of CPUs from the system */
    sysctl(mib, 2, &numCPU, &len, NULL, 0);
    
    if (numCPU < 1) 
    {
        mib[1] = HW_NCPU;
        sysctl(mib, 2, &numCPU, &len, NULL, 0);
        if (numCPU < 1)
            numCPU = 1;
    }
    
  • Objective C HPUX

    int numCPU = mpctl(MPC_GETNUMSPUS, NULL, NULL);
    
  • IRIX

    int numCPU = sysconf(_SC_NPROC_ONLN);
    
  • (Mac OS X> =10.5 или iOS)

    NSUInteger a = [[NSProcessInfo processInfo] processorCount];
    NSUInteger b = [[NSProcessInfo processInfo] activeProcessorCount];
    
670
ответ дан Toby Speight 4 January 2015 в 19:16
поделиться

На Linux лучший программируемый путь, насколько я знаю, состоит в том, чтобы использовать

sysconf(_SC_NPROCESSORS_CONF)

, или

sysconf(_SC_NPROCESSORS_ONLN)

Они не являются стандартными, но находятся в моей странице справочника для Linux.

2
ответ дан Tshepang 4 January 2015 в 19:16
поделиться

Вы, вероятно, не будете в состоянии получить его независимым от платформы путем. Windows Вы получаете количество процессоров.

информация о Системе Win32

7
ответ дан Tshepang 4 January 2015 в 19:16
поделиться

Windows Server 2003 и позже позволяет Вам усилить функцию GetLogicalProcessorInformation

http://msdn.microsoft.com/en-us/library/ms683194.aspx

4
ответ дан Chris Ballance 4 January 2015 в 19:16
поделиться

На Linux можно считать/proc/cpuinfo файл и считать ядра.

15
ответ дан JesperE 4 January 2015 в 19:16
поделиться

Если у Вас есть доступ ассемблера, можно использовать инструкцию CPUID получить все виды информации о ЦП. Это портативно между операционными системами, хотя необходимо будет использовать определенную для производителя информацию, чтобы определить, как найти количество ядер. Вот документ, который описывает, как сделать это на процессорах Intel , и страница 11 этот описывает спецификацию AMD.

37
ответ дан Tshepang 4 January 2015 в 19:16
поделиться

Эта функциональность является частью C++ 11 стандартов.

#include <thread>

unsigned int nthreads = std::thread::hardware_concurrency();

Для более старых компиляторов, можно использовать эти Повышение. Библиотека Thread .

#include <boost/thread.hpp>

unsigned int nthreads = boost::thread::hardware_concurrency();

В любом случае, hardware_concurrency() возвраты количество потоков, что аппаратные средства способны к выполнению одновременно на основе количества единиц гиперпоточности и ядер процессора.

197
ответ дан Ferruccio 4 January 2015 в 19:16
поделиться

Еще один рецепт Windows: используйте переменную среды в масштабе всей системы NUMBER_OF_PROCESSORS:

printf("%d\n", atoi(getenv("NUMBER_OF_PROCESSORS")));
7
ответ дан Constantin 4 January 2015 в 19:16
поделиться

можно использовать WMI в .net также, но Вы тогда зависите от wmi сервиса, работающего и т.д. Иногда, это работает локально, но тогда перестали работать, когда тот же код выполняется на серверах. Я полагаю, что это - проблема пространства имен, связанная с "именами", значения которых Вы читаете.

-2
ответ дан 4 January 2015 в 19:16
поделиться

Обратите внимание, что "количество ядер" не могло бы быть особенно полезным числом, Вам, возможно, придется квалифицировать его немного больше. Как Вы хотите считать многопоточные центральные процессоры, такие как Intel HT, IBM Power5 и Power6, и наиболее заметно, Niagara/UltraSparc T1 Sun и T2? Или еще более интересный, MIPS 1004k с его двумя уровнями аппаратной поточной обработки (супервизор И уровень пользователя)... Не говоря уже о том, что происходит, когда Вы перемещаетесь в поддерживаемые гипервизором системы, где аппаратные средства могли бы иметь десятки центральных процессоров, но Ваша конкретная ОС только видит некоторых.

лучшее, на которое можно надеяться, должно сказать количеству логических блоков обработки, что Вы имеете в своем локальном разделе ОС. Забудьте о наблюдении истинной машины, если Вы не гипервизор. Единственное исключение к этому правилу сегодня находится на земле x86, но конец невиртуальных машин прибывает быстро...

10
ответ дан Tshepang 4 January 2015 в 19:16
поделиться

OpenMP поддерживается на многих платформах (включая Visual Studio 2005), и это предлагает

int omp_get_num_procs();

функция, которая возвращает количество процессоров/ядер, доступных во время вызова.

55
ответ дан angainor 4 January 2015 в 19:16
поделиться

В Linux Вы можете контроль dmesg и фильтровать строки, где ACPI инициализирует центральные процессоры, что-то как:

dmesg | grep 'ACPI: Processor'

Другая возможность состоит в том, чтобы использовать dmidecode для отфильтровывания информации о процессоре.

-3
ответ дан 22 November 2019 в 23:07
поделиться

Альтернатива OS X: описанное ранее решение на основе [[NSProcessInfo processInfo] processorCount] доступно только в OS X 10.5.0, согласно документации. Для более ранних версий OS X используйте функцию Carbon MPProcessors ().

Если вы программист какао, не пугайтесь того факта, что это Carbon. Вам просто нужно добавить фреймворк Carbon в ваш проект Xcode, и MPProcessors () будет доступен.

2
ответ дан 22 November 2019 в 23:07
поделиться

(Почти) Независимая от платформы функция в c-коде

#ifdef _WIN32
#include <windows.h>
#elif MACOS
#include <sys/param.h>
#include <sys/sysctl.h>
#else
#include <unistd.h>
#endif

int getNumCores() {
#ifdef WIN32
    SYSTEM_INFO sysinfo;
    GetSystemInfo(&sysinfo);
    return sysinfo.dwNumberOfProcessors;
#elif MACOS
    int nm[2];
    size_t len = 4;
    uint32_t count;

    nm[0] = CTL_HW; nm[1] = HW_AVAILCPU;
    sysctl(nm, 2, &count, &len, NULL, 0);

    if(count < 1) {
        nm[1] = HW_NCPU;
        sysctl(nm, 2, &count, &len, NULL, 0);
        if(count < 1) { count = 1; }
    }
    return count;
#else
    return sysconf(_SC_NPROCESSORS_ONLN);
#endif
}
31
ответ дан 22 November 2019 в 23:07
поделиться