aboutsummaryrefslogtreecommitdiff
path: root/Carpet/Carpet/src/SetupGH.cc
diff options
context:
space:
mode:
authorErik Schnetter <schnetter@gmail.com>2012-03-17 20:36:29 -0400
committerBarry Wardell <barry.wardell@gmail.com>2012-09-11 18:23:12 +0100
commite03aedc3492ed6ef85468e2795aeb3260033d278 (patch)
treeb89b0ad37b2c41aa610be38bfa02c404c103444c /Carpet/Carpet/src/SetupGH.cc
parentb8ac4bb81a79d32dea8a62a8918930231d17ad52 (diff)
Carpet: Check CPU affinity per thread, not per process
Diffstat (limited to 'Carpet/Carpet/src/SetupGH.cc')
-rw-r--r--Carpet/Carpet/src/SetupGH.cc63
1 files changed, 46 insertions, 17 deletions
diff --git a/Carpet/Carpet/src/SetupGH.cc b/Carpet/Carpet/src/SetupGH.cc
index e52597646..da68b3162 100644
--- a/Carpet/Carpet/src/SetupGH.cc
+++ b/Carpet/Carpet/src/SetupGH.cc
@@ -326,12 +326,24 @@ namespace Carpet {
if (set_cpu_affinity) {
#ifdef HAVE_SCHED_GETAFFINITY
- cpu_set_t mask;
- int const ierr = sched_getaffinity (0, sizeof mask, &mask);
- assert (not ierr);
+ // Note: this allows only up to 64 cores
+ typedef unsigned long long mask_t;
+ assert(mynthreads <= 8 * sizeof(mask_t));
+ mask_t mask = 0;
+#pragma omp parallel reduction(|: mask)
+ {
+ cpu_set_t cpumask;
+ int const ierr = sched_getaffinity (0, sizeof cpumask, &cpumask);
+ assert (not ierr);
+ for (int n=0; n<CPU_SETSIZE; ++n) {
+ if (CPU_ISSET(n, &cpumask)) {
+ mask |= (mask_t)1 << n;
+ }
+ }
+ }
int n0 = -1;
- for (int n=0; n<CPU_SETSIZE; ++n) {
- if (CPU_ISSET(n, &mask)) {
+ for (int n=0; n<8*sizeof(mask_t); ++n) {
+ if (mask & ((mask_t)1 << n)) {
n0 = n;
break;
}
@@ -340,12 +352,17 @@ namespace Carpet {
CCTK_VInfo (CCTK_THORNSTRING,
"Selecting cores %d-%d for this process",
n0, n0+mynthreads-1);
- CPU_ZERO(&mask);
- for (int n=n0; n<min(n0 + mynthreads, CPU_SETSIZE); ++n) {
- CPU_SET(n, &mask);
+#pragma omp parallel
+ {
+ cpu_set_t cpumask;
+ CPU_ZERO(&cpumask);
+ CPU_SET(n0 + omp_get_thread_num(), &cpumask);
+ int const ierr = sched_setaffinity(0, sizeof(cpumask), &cpumask);
+ assert (not ierr);
}
- int const ierr1 = sched_setaffinity(0, sizeof(mask), &mask);
- assert (not ierr1);
+ } else {
+ CCTK_WARN (CCTK_WARN_ALERT,
+ "Cannot select core set for this process (no cores seem available to this process)");
}
#else
CCTK_WARN (CCTK_WARN_ALERT,
@@ -355,22 +372,34 @@ namespace Carpet {
#ifdef HAVE_SCHED_GETAFFINITY
{
- cpu_set_t mask;
- int const ierr = sched_getaffinity (0, sizeof mask, &mask);
- assert (not ierr);
+ // Note: this allows only up to 64 cores
+ typedef unsigned long long mask_t;
+ assert(mynthreads <= 8 * sizeof(mask_t));
+ mask_t mask = 0;
+#pragma omp parallel reduction(|: mask)
+ {
+ cpu_set_t cpumask;
+ int const ierr = sched_getaffinity (0, sizeof cpumask, &cpumask);
+ assert (not ierr);
+ for (int n=0; n<CPU_SETSIZE; ++n) {
+ if (CPU_ISSET(n, &cpumask)) {
+ mask |= (mask_t)1 << n;
+ }
+ }
+ }
ostringstream buf;
int num_cores = 0;
bool isfirst = true;
int first_active = -1;
- for (int n=0; n<CPU_SETSIZE; ++n) {
- if (CPU_ISSET(n, &mask)) ++num_cores;
- if (first_active == -1 and CPU_ISSET(n, &mask)) {
+ for (int n=0; n<8*sizeof(mask_t); ++n) {
+ if (mask & ((mask_t)1 << n)) ++num_cores;
+ if (first_active == -1 and (mask & ((mask_t)1 << n))) {
if (not isfirst) buf << ", ";
isfirst = false;
buf << n;
first_active = n;
- } else if (first_active >= 0 and not CPU_ISSET(n, &mask)) {
+ } else if (first_active >= 0 and not (mask & ((mask_t)1 << n))) {
if (n-1 > first_active) buf << "-" << n-1;
first_active = -1;
}