Unverified Commit 1dde202b authored by Haehner, Urs Rene's avatar Haehner, Urs Rene Committed by GitHub
Browse files

Merge pull request #185 from gbalduzz/fix_141

Fix #141
parents bce2e7fc 92f9e5c7
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -19,11 +19,15 @@ namespace parallel {
// dca::parallel::

// Returns a list of cores id for which the calling thread has affinity.
// If the macro __linux__ is not defined, returns an empty vector.
std::vector<int> get_affinity();

// Sets the affinity list of the current thread.
// If the macro __linux__ is not defined, performs a no-op.
void set_affinity(const std::vector<int>& cores);

// Number of cores used by this process.
// Returns the number of visible hardware cores.
// If the macro __linux__ is not defined, returns std::hardware_concurrency().
int get_core_count();

}  // namespace parallel
+24 −5
Original line number Diff line number Diff line
@@ -9,24 +9,30 @@
//
// This file implements the methods in affinity.hpp.

// GNU extensions are required for linux-specific features for querying affinity
#if defined(__linux__) && !defined(_GNU_SOURCE)
#define _GNU_SOURCE
#endif

#include "dca/parallel/stdthread/thread_pool/affinity.hpp"

#include <iostream>
#include <cstdlib>
#include <stdexcept>
#include <thread>

// GNU extensions are required for linux-specific features for querying affinity
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include "dca/util/ignore.hpp"

#if defined(__linux__)
#include <sched.h>
#include <stdexcept>
#endif

namespace dca {
namespace parallel {
// dca::parallel::

std::vector<int> get_affinity() {
#if defined(__linux__)
  cpu_set_t cpu_set_mask;

  auto status = sched_getaffinity(0, sizeof(cpu_set_t), &cpu_set_mask);
@@ -51,9 +57,14 @@ std::vector<int> get_affinity() {
  }

  return cores;

#else  // !defined(__linux__)
  return {};
#endif
}

void set_affinity(const std::vector<int>& cores) {
#if defined(__linux__)
  cpu_set_t cpu_set_mask;
  CPU_ZERO(&cpu_set_mask);

@@ -62,12 +73,20 @@ void set_affinity(const std::vector<int>& cores) {
  }

  sched_setaffinity(0, sizeof(cpu_set_t), &cpu_set_mask);
#else  // !defined(__linux__)
  dca::util::ignoreUnused(cores);
#endif
}

int get_core_count() {
#if defined(__linux__)
  cpu_set_t cpu_set_mask;
  sched_getaffinity(0, sizeof(cpu_set_t), &cpu_set_mask);
  return CPU_COUNT(&cpu_set_mask);

#else  // !defined(__linux__)
  return std::thread::hardware_concurrency();
#endif
}

}  // namespace parallel
+4 −5
Original line number Diff line number Diff line
@@ -13,7 +13,6 @@

#include <iostream>
#include <future>
#include <thread>

#include "gtest/gtest.h"

@@ -40,12 +39,12 @@ TEST(AffinityTest, All) {
    dca::parallel::set_affinity(new_set);

    auto b = dca::parallel::get_affinity();
#if defined(__linux__)
    EXPECT_TRUE(equal(new_set, b));
#else
    EXPECT_TRUE(equal(std::vector<int>{}, b));
#endif
  });

  f.get();
}

 TEST(AffinityTest, Count) {
  EXPECT_EQ(std::thread::hardware_concurrency(), dca::parallel::get_core_count());
}