Loading include/dca/parallel/stdthread/thread_pool/affinity.hpp +5 −1 Original line number Diff line number Diff line Loading @@ -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 Loading src/parallel/stdthread/thread_pool/affinity.cpp +24 −5 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); Loading @@ -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 Loading test/unit/parallel/stdthread/thread_pool/affinity_test.cpp +4 −5 Original line number Diff line number Diff line Loading @@ -13,7 +13,6 @@ #include <iostream> #include <future> #include <thread> #include "gtest/gtest.h" Loading @@ -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()); } Loading
include/dca/parallel/stdthread/thread_pool/affinity.hpp +5 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
src/parallel/stdthread/thread_pool/affinity.cpp +24 −5 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); Loading @@ -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 Loading
test/unit/parallel/stdthread/thread_pool/affinity_test.cpp +4 −5 Original line number Diff line number Diff line Loading @@ -13,7 +13,6 @@ #include <iostream> #include <future> #include <thread> #include "gtest/gtest.h" Loading @@ -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()); }