DEV Community

loading...

How to know number of tasks can run in parallel in Linux and MacOS

0xbf profile image Bo ・2 min read

I want to know the CPU cores & threads count, so that I could know how many tasks my computer can run in parallel. This number could later be used for specifying the pool size when creating a threading pool.

To get this count, the formula is:

num_of_cpu * cores_per_cpu * threads_per_core

For example, if you have 1 cpu, and it has 2 cores, and each core enabled hyperthreading, so the final result might be 1 * 2 * 2 = 4

Linux

We get use lscpu to get a brief result:

$ lscpu
...
CPU(s):              4
Thread(s) per core:  1
...

Or we could use 3 separate commands to get more info:

$ cat /proc/cpuinfo | grep "physical id"| sort | uniq | wc -l
4
$ cat /proc/cpuinfo | grep "cores" | uniq
cpu cores : 1
$ cat /proc/cpuinfo | grep "processor"| wc -l
4

So in this machine, we have 4 cpu, each cpu has 1 core, there is no hyperthreading enabled, because the processor count is 4. Otherwise, the processor count should be greater than 4.

The number of tasks can run parallel for this computer is 4 * 1 * 1 = 4

MacOS

If you go to "About This Mac > System Report", you will be able to see some information about CPU. It looks like something like this:

system info

From here we can see the number of CPU is 1, the Cores_Per_CPU is 2, but it doesn't show how many threads for one core, i.e. if the hyperthreading is enabled.

If we open terminal and use command:

$ sysctl hw.physicalcpu hw.logicalcpu
hw.physicalcpu: 2
hw.logicalcpu: 4

Or we can use:

$ sysctl -a | grep machdep.cpu | grep count
machdep.cpu.core_count: 2
machdep.cpu.thread_count: 4

Now you can see the core_count is 2, and thread_count is 4, means threads_per_core is 2 (hyperthreading is enabled).

The number of tasks can run parallel for this computer is 1 * 2 * 2 = 4

Discussion (1)

pic
Editor guide
Collapse
ac000 profile image
Andrew Clayton

On Linux at least, you can also get this at run-time from C (and I dare say other languages) with get_nprocs(3) and/or sysconf(3) with the _SC_NPROCESSORS_ONLN variable.