Просмотр исходного кода

Add pin threads to cores support

Panagiotis Christopoulos Charitos 10 лет назад
Родитель
Сommit
32aa943025
3 измененных файлов с 17 добавлено и 5 удалено
  1. 3 2
      include/anki/util/Thread.h
  2. 13 2
      src/util/ThreadPosix.cpp
  3. 1 1
      src/util/ThreadWindows.cpp

+ 3 - 2
include/anki/util/Thread.h

@@ -36,7 +36,7 @@ public:
 	using Callback = Error (*)(Info&);
 
 	/// Create a thread with or without a name
-	/// @param[in] name The name of the new thread. Can be nullptr
+	/// @param[in] name The name of the new thread. Can be nullptr.
 	Thread(const char* name);
 
 	~Thread();
@@ -44,7 +44,8 @@ public:
 	/// Start the thread
 	/// @param userData The user data of the thread callback
 	/// @param callback The thread callback that will be executed
-	void start(void* userData, Callback callback);
+	/// @param pinToCore Pin the thread to a core.
+	void start(void* userData, Callback callback, I pinToCore = -1);
 
 	/// Wait for the thread to finish
 	/// @return The error code of the thread's callback

+ 13 - 2
src/util/ThreadPosix.cpp

@@ -70,17 +70,28 @@ Thread::~Thread()
 }
 
 //==============================================================================
-void Thread::start(void* userData, Callback callback)
+void Thread::start(void* userData, Callback callback, I pinToCore)
 {
 	ANKI_ASSERT(!m_started);
 	ANKI_ASSERT(callback != nullptr);
 
+	pthread_attr_t attr;
+    cpu_set_t cpus;
+    pthread_attr_init(&attr);
+
+	if(pinToCore >= 0)
+	{
+		CPU_ZERO(&cpus);
+		CPU_SET(pinToCore, &cpus);
+		pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &cpus);
+	}
+
 	pthread_t* thread = reinterpret_cast<pthread_t*>(m_impl);
 
 	m_callback = callback;
 	m_userData = userData;
 
-	I err = pthread_create(thread, nullptr, pthreadCallback, this);
+	I err = pthread_create(thread, &attr, pthreadCallback, this);
 	if(err)
 	{
 		ANKI_LOGF("pthread_create() failed");

+ 1 - 1
src/util/ThreadWindows.cpp

@@ -68,7 +68,7 @@ Thread::~Thread()
 }
 
 //==============================================================================
-void Thread::start(void* userData, Callback callback)
+void Thread::start(void* userData, Callback callback, I pinToCore)
 {
 	ANKI_ASSERT(!m_started);
 	ANKI_ASSERT(callback != nullptr);