• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <cstdio>
2 
getPossibleCPUs()3 static inline int getPossibleCPUs()
4 {
5    FILE* cpuPossible = fopen("/sys/devices/system/cpu/possible", "r");
6    if(!cpuPossible)
7        return 1;
8 
9    char buf[2000]; //big enough for 1000 CPUs in worst possible configuration
10    char* pbuf = fgets(buf, sizeof(buf), cpuPossible);
11    fclose(cpuPossible);
12    if(!pbuf)
13       return 1;
14 
15    //parse string of form "0-1,3,5-7,10,13-15"
16    int cpusAvailable = 0;
17 
18    while(*pbuf)
19    {
20       const char* pos = pbuf;
21       bool range = false;
22       while(*pbuf && *pbuf != ',')
23       {
24           if(*pbuf == '-') range = true;
25           ++pbuf;
26       }
27       if(*pbuf) *pbuf++ = 0;
28       if(!range)
29         ++cpusAvailable;
30       else
31       {
32           int rstart = 0, rend = 0;
33           sscanf(pos, "%d-%d", &rstart, &rend);
34           cpusAvailable += rend - rstart + 1;
35       }
36 
37    }
38    return cpusAvailable ? cpusAvailable : 1;
39 }
40 
41 #define __TBB_HardwareConcurrency() getPossibleCPUs()
42