Loading src/PthreadsNg.h +17 −65 Original line number Diff line number Diff line Loading @@ -154,7 +154,23 @@ public: : nthreads_(codeSectionParams.npthreads), setAffinities_(codeSectionParams.setAffinities), stackSize_(codeSectionParams.stackSize) {} { #ifndef __APPLE__ cpu_set_t cpuset; static bool firstCall = true; if (setAffinities_) { pid_t pid = getpid(); // always successfull getPidAffinity(&cpuset, pid); int ret = sched_setaffinity(pid, sizeof(cpu_set_t), &cpuset); checkForError(ret); if (ret == 0 && firstCall) { std::cout<<"pid "<<pid<<" sched_setaffinity with count "; std::cout<<CPU_COUNT(&cpuset)<<"\n"; firstCall = false; } } #endif } bool affinities() const { return setAffinities_; } Loading Loading @@ -205,15 +221,6 @@ public: pthread_attr_t** attr = new pthread_attr_t*[nthreads_]; SizeType ntasks = pfh.tasks(); #ifndef __APPLE__ // cpu_set_t cpuset; // if (setAffinities_) { // pid_t pid = getpid(); // always successfull // getPidAffinity(&cpuset, pid); // } #endif for (SizeType j=0; j <nthreads_; j++) { pfs[j].pfh = &pfh; pfs[j].loadBalancer = &loadBalancer; Loading Loading @@ -267,29 +274,6 @@ public: private: void setAffinity(pthread_attr_t* attr, cpu_set_t* cpuset, SizeType threadNum) const { // pick a cpu from cpuset int chosenCpu = getOneCpuFromSet(cpuset); if (chosenCpu < 0) { std::cerr<<"setAffinity: no cpus left in set for thread "<<threadNum<<"\n"; return; } cpu_set_t mynewset; CPU_ZERO(&mynewset); CPU_SET(chosenCpu, &mynewset); // add cpu to new set int ret = pthread_attr_setaffinity_np(attr, sizeof(cpu_set_t), &mynewset); checkForError(ret); if (ret != 0) return; std::cerr<<"Threadnum "<<threadNum<<" cpu=" << chosenCpu<<"\n"; std::cerr.flush(); // remove cpu from set CPU_CLR(chosenCpu, cpuset); } void getPidAffinity(cpu_set_t* cpuset, pid_t pid) const { CPU_ZERO(cpuset); Loading @@ -299,38 +283,6 @@ private: CPU_ZERO(cpuset); return; } int count = CPU_COUNT(cpuset); std::cout<<"Pid "<<pid<<": "<<count<<" in sched_getaffinity\n"; std::vector<SizeType> cpus(MAX_CPUS); int total = 0; for (int i = 0; i < MAX_CPUS; ++i) { if (CPU_ISSET(i, cpuset) == 0) continue; cpus[total++] = i; if (total == count) break; } std::cout<<"Pid "<<pid<<": "; for (int i = 0; i < total; ++i) std::cout<<cpus[i]<<" "; std::cout<<"\n"; std::cout.flush(); } int getOneCpuFromSet(cpu_set_t* cpuset) const { int count = CPU_COUNT(cpuset); if (count == 0) return -1; int chosenCpu = -1; for (int i = 0; i < MAX_CPUS; ++i) { if (CPU_ISSET(i, cpuset) == 0) continue; chosenCpu = i; break; } return chosenCpu; } void checkForError(int ret) const Loading Loading
src/PthreadsNg.h +17 −65 Original line number Diff line number Diff line Loading @@ -154,7 +154,23 @@ public: : nthreads_(codeSectionParams.npthreads), setAffinities_(codeSectionParams.setAffinities), stackSize_(codeSectionParams.stackSize) {} { #ifndef __APPLE__ cpu_set_t cpuset; static bool firstCall = true; if (setAffinities_) { pid_t pid = getpid(); // always successfull getPidAffinity(&cpuset, pid); int ret = sched_setaffinity(pid, sizeof(cpu_set_t), &cpuset); checkForError(ret); if (ret == 0 && firstCall) { std::cout<<"pid "<<pid<<" sched_setaffinity with count "; std::cout<<CPU_COUNT(&cpuset)<<"\n"; firstCall = false; } } #endif } bool affinities() const { return setAffinities_; } Loading Loading @@ -205,15 +221,6 @@ public: pthread_attr_t** attr = new pthread_attr_t*[nthreads_]; SizeType ntasks = pfh.tasks(); #ifndef __APPLE__ // cpu_set_t cpuset; // if (setAffinities_) { // pid_t pid = getpid(); // always successfull // getPidAffinity(&cpuset, pid); // } #endif for (SizeType j=0; j <nthreads_; j++) { pfs[j].pfh = &pfh; pfs[j].loadBalancer = &loadBalancer; Loading Loading @@ -267,29 +274,6 @@ public: private: void setAffinity(pthread_attr_t* attr, cpu_set_t* cpuset, SizeType threadNum) const { // pick a cpu from cpuset int chosenCpu = getOneCpuFromSet(cpuset); if (chosenCpu < 0) { std::cerr<<"setAffinity: no cpus left in set for thread "<<threadNum<<"\n"; return; } cpu_set_t mynewset; CPU_ZERO(&mynewset); CPU_SET(chosenCpu, &mynewset); // add cpu to new set int ret = pthread_attr_setaffinity_np(attr, sizeof(cpu_set_t), &mynewset); checkForError(ret); if (ret != 0) return; std::cerr<<"Threadnum "<<threadNum<<" cpu=" << chosenCpu<<"\n"; std::cerr.flush(); // remove cpu from set CPU_CLR(chosenCpu, cpuset); } void getPidAffinity(cpu_set_t* cpuset, pid_t pid) const { CPU_ZERO(cpuset); Loading @@ -299,38 +283,6 @@ private: CPU_ZERO(cpuset); return; } int count = CPU_COUNT(cpuset); std::cout<<"Pid "<<pid<<": "<<count<<" in sched_getaffinity\n"; std::vector<SizeType> cpus(MAX_CPUS); int total = 0; for (int i = 0; i < MAX_CPUS; ++i) { if (CPU_ISSET(i, cpuset) == 0) continue; cpus[total++] = i; if (total == count) break; } std::cout<<"Pid "<<pid<<": "; for (int i = 0; i < total; ++i) std::cout<<cpus[i]<<" "; std::cout<<"\n"; std::cout.flush(); } int getOneCpuFromSet(cpu_set_t* cpuset) const { int count = CPU_COUNT(cpuset); if (count == 0) return -1; int chosenCpu = -1; for (int i = 0; i < MAX_CPUS; ++i) { if (CPU_ISSET(i, cpuset) == 0) continue; chosenCpu = i; break; } return chosenCpu; } void checkForError(int ret) const Loading