सी

2011-01-03 22 views
38

का उपयोग कर लिनक्स में सीपीयू की संख्या प्राप्त करें क्या लिनक्स में उपलब्ध सीपीयू की संख्या प्राप्त करने के लिए कोई एपीआई है? मैं मतलब, का उपयोग करते हुए/proc/cpuinfo या किसी अन्य सिस-नोड फ़ाइल ...सी

बिना मैं इस कार्यान्वयन sched.h का उपयोग कर पाया गया है:

int GetCPUCount() 
{ 
cpu_set_t cs; 
CPU_ZERO(&cs); 
sched_getaffinity(0, sizeof(cs), &cs); 

int count = 0; 
for (int i = 0; i < 8; i++) 
{ 
    if (CPU_ISSET(i, &cs)) 
    count++; 
} 
return count; 
} 

लेकिन, अधिक कुछ भी नहीं है सामान्य पुस्तकालयों का उपयोग कर उच्च स्तर?

+22

क्यों लोग इतने/proc उपयोग करने के लिए डर रहे हैं? पिछले 15 वर्षों में मैंने जो भी लिनक्स बॉक्स देखा है, वह हमेशा कर्नेल को जानता है कि यह अद्यतित है, और इसमें मौजूदा सामान का प्रारूप ज्यादा नहीं बदलता है। – cHao

+1

मुझे लगता है कि यह बहुत अच्छा है कि आप चीजों को करने के विभिन्न तरीकों को सीखने की कोशिश कर रहे हैं, लेकिन क्या आप पहिया को फिर से शुरू करने की कोशिश कर रहे हैं? – Davidann

+0

संभावित डुप्लिकेट [मैं सी/लिनक्स पर प्रोसेसर की संख्या कैसे प्राप्त करूं?] (Http://stackoverflow.com/questions/2693948/how-do-i-retrieve-the-number-of-processors-on- सी-लिनक्स) –

उत्तर

2
#include <stdio.h> 
#include <sys/sysinfo.h> 
int 
int main(int argc, char *argv[]) 
{ 
    printf("This system has %d processors configured and " 
     "%d processors available.\n", 
     get_nprocs_conf(), get_nprocs()); 
    return 0; 
} 

https://linux.die.net/man/3/get_nprocs

65
#include <unistd.h> 
sysconf(_SC_NPROCESSORS_ONLN); 
+1

प्लस: मैक ओएसएक्स पर काम करता है। –

+1

अच्छा समाधान, लेकिन POSIX के लिए एक लिनक्स एक्सटेंशन की तरह लगता है: http://pubs.opengroup.org/onlinepubs/9699919799/functions/sysconf.html –

+1

प्लस: सिगविन – zhangyoufu

15

/proc/cpuinfo का उपयोग करना सबसे स्वच्छ और सबसे पोर्टेबल समाधान है। यदि खुला विफल रहता है, तो आप बस 1 सीपीयू या 2 सीपीयू मान सकते हैं। कोड जो माइक्रो-ऑप्टिमाइज़िंग के अलावा किसी उद्देश्य के लिए सीपीयू की संख्या जानने पर निर्भर करता है (उदाहरण के लिए थ्रेड के आदर्श संख्या को चुनना) लगभग निश्चित रूप से कुछ गूंगा कर रहा है।

_SC_NPROCESSORS_ONLN समाधान एक गैर मानक पर निर्भर करता है (glibc विशेष) sysconf विस्तार है, जो की तुलना में एक बहुत बड़ा निर्भरता है /proc (सभी Linux सिस्टम /proc है, लेकिन कुछ गैर glibc libcs ​​या glibc के पुराने संस्करणों कि कमी है _SC_NPROCESSORS_ONLN)।

+11

+1 ओपी खुद को लटकाने के बारे में अशिष्ट लग रहा था, इसलिए मैंने उसे रस्सी दी। – chrisaycock

+3

मुझे लगता है कि Ulrich Drepper उसे रस्सी दे दी। मैं वास्तव में इस तरह की गैर-मानक चीजों को जोड़ने के लिए प्रेरणा को समझ नहीं पा रहा हूं जब एक मौजूदा, अधिक क्लीनर और एक ही चीज़ करने के लिए अधिक पोर्टेबल तरीका है। (यदि आप अपने प्रोग्राम में '_SC_NPROCESSORS_ONLN' लिखते हैं, तो निरंतर गुम होने पर यह संकलित करने में असफल हो जाएगा, लेकिन अन्य तरीकों से रनटाइम पर असफल हो जाता है (विफल' खुला ', आदि) और किसी भी सेन कोड विफलता स्थिति को संभालेगा।) –

+8

पोर्टेबल/proc/cpuinfo किस तरह से है? यह एक लिनक्स-विशिष्ट इंटरफ़ेस है (कुछ अन्य सिस्टम इसे अनुकरण करते हैं, उदाहरण के लिए, linBSocfs फाइल सिस्टम के साथ फ्रीबीएसडी/proc में आरोहित)।उदाहरण के लिए sysconfig _SC_NPROCESSORS_ONLN, फ्रीबीएसडी द्वारा समर्थित है। – MarkR

14

यह कोड (here से खींचा गया) दोनों विंडोज़ और * एनआईक्स प्लेटफ़ॉर्म पर काम करना चाहिए।

#ifdef _WIN32 
#define WIN32_LEAN_AND_MEAN 
#include <windows.h> 
#else 
#include <unistd.h> 
#endif 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 


int main() { 
    long nprocs = -1; 
    long nprocs_max = -1; 
#ifdef _WIN32 
#ifndef _SC_NPROCESSORS_ONLN 
SYSTEM_INFO info; 
GetSystemInfo(&info); 
#define sysconf(a) info.dwNumberOfProcessors 
#define _SC_NPROCESSORS_ONLN 
#endif 
#endif 
#ifdef _SC_NPROCESSORS_ONLN 
    nprocs = sysconf(_SC_NPROCESSORS_ONLN); 
    if (nprocs < 1) 
    { 
    fprintf(stderr, "Could not determine number of CPUs online:\n%s\n", 
strerror (errno)); 
    exit (EXIT_FAILURE); 
    } 
    nprocs_max = sysconf(_SC_NPROCESSORS_CONF); 
    if (nprocs_max < 1) 
    { 
    fprintf(stderr, "Could not determine number of CPUs configured:\n%s\n", 
strerror (errno)); 
    exit (EXIT_FAILURE); 
    } 
    printf ("%ld of %ld processors online\n",nprocs, nprocs_max); 
    exit (EXIT_SUCCESS); 
#else 
    fprintf(stderr, "Could not determine number of CPUs"); 
    exit (EXIT_FAILURE); 
#endif 
} 
+0

मुझे इस कोड को किसी से बहुत समय पहले मिला (नाम याद नहीं है)। –

+2

मुझे यकीन नहीं है कि इस कोड स्निपेट को पोस्ट करने से वास्तव में ओपी के प्रश्न का उत्तर दिया जा सकता है, हालांकि वे इसके बारे में कुछ उपयोगी जानकारी रिवर्स-इंजीनियर कर सकते हैं। – MarkR

+1

मैं मार्कआर से सहमत हूं। क्रिससाकॉक एक संक्षिप्त उत्तर प्रदान करता है। – poindexter

9

sched_affinity() संस्करण आप शुरुआत में उल्लेख अभी भी /proc/cpuinfo और/या _SC_NPROCESSORS_ONLN की तुलना में बेहतर है, क्योंकि यह केवल एक दिया प्रक्रिया के लिए उपलब्ध सीपीयू में गिना जाता है (कुछ sched_setaffinity() एक बाहरी प्रक्रिया द्वारा लाया द्वारा अक्षम किया जा सकता है)। एकमात्र परिवर्तन एक लूप में CPU_ISSET करने के बजाय CPU_COUNT() का उपयोग करेगा।

0

एक अन्य विधि स्कैनिंग cpu * sys फाइल सिस्टम के तहत निर्देशिका:

#include<stdio.h> 
#include <dirent.h> 
#include <errno.h> 
#define LINUX_SYS_CPU_DIRECTORY "/sys/devices/system/cpu" 

int main() { 
    int cpu_count = 0; 
    DIR *sys_cpu_dir = opendir(LINUX_SYS_CPU_DIRECTORY); 
    if (sys_cpu_dir == NULL) { 
     int err = errno; 
     printf("Cannot open %s directory, error (%d).\n", LINUX_SYS_CPU_DIRECTORY, strerror(err)); 
     return -1; 
    } 
    const struct dirent *cpu_dir; 
    while((cpu_dir = readdir(sys_cpu_dir)) != NULL) { 
     if (fnmatch("cpu[0-9]*", cpu_dir->d_name, 0) != 0) 
     { 
      /* Skip the file which does not represent a CPU */ 
      continue; 
     } 
     cpu_count++; 
    } 
    printf("CPU count: %d\n", cpu_count); 
    return 0; 
}