Commit cee58247 authored by Alvarez, Gonzalo's avatar Alvarez, Gonzalo
Browse files

setAffinities

sched_setaffinity from sched_getaffinity
parent 8bfa6aaf
Loading
Loading
Loading
Loading
+17 −65
Original line number Diff line number Diff line
@@ -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_; }

@@ -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;
@@ -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);
@@ -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