From n||@@kehre|n @end|ng |rom gm@||@com  Mon Aug  7 08:48:23 2023
From: n||@@kehre|n @end|ng |rom gm@||@com (Nils Kehrein)
Date: Mon, 7 Aug 2023 08:48:23 +0200
Subject: [Rd] Detecting physical CPUs in detectCores() on Linux platforms
Message-ID: <CAObhMffcPOLHN_ko1VQEu-taHjCiuc5kPCA9ybS1O9r_UOn1GQ@mail.gmail.com>

Dear all,

I recently noticed that `detectCores()` ignores the `logical=FALSE`
argument on Linux platforms. This means that the function will always
return the number of logical CPUs, i.e. it will count the number of threads
that theoretically can run in parallel due to e.g. hyper-threading.
Unfortunately, this can result in issues in high-performance computing use
cases where hyper-threading might degrade performance instead of improving
it.

Currently, src/library/parallel/R/detectCores.R uses the following R/shell
code fragment to identify the number of logical CPUs:
linux = 'grep "^processor" /proc/cpuinfo 2>/dev/null | wc -l'

As far as I understand, one could derive the number of online physical CPUs
by parsing the contents of /sys/devices/system/cpu/* but that seems rather
cumbersome. Instead, could we amend the R code with the following line?
linux = if(logical) 'grep "^processor" /proc/cpuinfo 2>/dev/null | wc -l'
else 'lscpu -b --parse="CORE" | tail -n +5 | sort -u | wc -l'

This solution uses `lscpu` from `sys-utils`. The -b switch makes sure that
only online CPUs/cores are listed and due to the --parse="CORE", the output
will contain only a single column with logical core ids. It seems to do the
job in my view, but there might be edge cases for exotic CPU topologies
that I am not aware of.

Thank you, Nils

	[[alternative HTML version deleted]]



[Rd] Detecting physical CPUs in detectCores() on Linux platforms
Nils Kehrein