Fix T60585: Cycles not using all cores on threadripper, after recent changes.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Fri, 18 Jan 2019 18:15:38 +0000 (19:15 +0100)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Fri, 18 Jan 2019 19:58:56 +0000 (20:58 +0100)
intern/cycles/util/util_task.cpp
intern/cycles/util/util_thread.cpp
intern/cycles/util/util_thread.h

index 4241c4aa8ccdda83f26c8d0dde983ea1bcda2e20..6260d8d13aba84b72df4baa2fda256b9d523dea8 100644 (file)
@@ -225,9 +225,9 @@ int get_num_total_processors(const vector<int>& num_per_node_processors)
 
 /* Assign every thread a node on which is should be running, for the best
  * performance. */
-void distribute_threads_on_nodes(const vector<thread*>& threads)
+vector<int> distribute_threads_on_nodes(const int num_threads)
 {
-       const int num_threads = threads.size();
+       vector<int> thread_nodes(num_threads, -1);
        const int num_active_group_processors =
                system_cpu_num_active_group_processors();
        VLOG(1) << "Detected " << num_active_group_processors << " processors "
@@ -241,14 +241,14 @@ void distribute_threads_on_nodes(const vector<thread*>& threads)
                 * have two Cycles/Blender instances running manually set to a different
                 * dies on a CPU. */
                VLOG(1) << "Not setting thread group affinity.";
-               return;
+               return thread_nodes;
        }
        vector<int> num_per_node_processors;
        get_per_node_num_processors(&num_per_node_processors);
        if(num_per_node_processors.size() == 0) {
                /* Error was already repported, here we can't do anything, so we simply
                 * leave default affinity to all the worker threads. */
-               return;
+               return thread_nodes;
        }
        const int num_nodes = num_per_node_processors.size();
        int thread_index = 0;
@@ -273,11 +273,11 @@ void distribute_threads_on_nodes(const vector<thread*>& threads)
                {
                        VLOG(1) << "Scheduling thread " << thread_index << " to node "
                                << current_node_index << ".";
-                       threads[thread_index]->schedule_to_node(current_node_index);
+                       thread_nodes[thread_index] = current_node_index;
                        ++thread_index;
                        if(thread_index == num_threads) {
                                /* All threads are scheduled on their nodes. */
-                               return;
+                               return thread_nodes;
                        }
                }
                ++current_node_index;
@@ -305,6 +305,8 @@ void distribute_threads_on_nodes(const vector<thread*>& threads)
                ++thread_index;
                current_node_index = (current_node_index + 1) % num_nodes;
        }
+
+       return thread_nodes;
 }
 
 }  // namespace
@@ -325,13 +327,17 @@ void TaskScheduler::init(int num_threads)
                num_threads = system_cpu_thread_count();
        }
        VLOG(1) << "Creating pool of " << num_threads << " threads.";
+
+       /* Compute distribution on NUMA nodes. */
+       vector<int> thread_nodes = distribute_threads_on_nodes(num_threads);
+
        /* Launch threads that will be waiting for work. */
        threads.resize(num_threads);
        for(int thread_index = 0; thread_index < num_threads; ++thread_index) {
                threads[thread_index] = new thread(
-                       function_bind(&TaskScheduler::thread_run, thread_index + 1));
+                       function_bind(&TaskScheduler::thread_run, thread_index + 1),
+                       thread_nodes[thread_index]);
        }
-       distribute_threads_on_nodes(threads);
 }
 
 void TaskScheduler::exit()
index 1880eefcb9c6520c539d2a21da10827978001a80..4d30e3f564fe37f3180bc57418ffef12d7dd49d3 100644 (file)
@@ -58,9 +58,4 @@ bool thread::join()
        }
 }
 
-void thread::schedule_to_node(int node)
-{
-       node_ = node;
-}
-
 CCL_NAMESPACE_END
index d21a7a8c773dfb0e40c6e782d422fc506316af02..9ae9af25e6b74cbbcffa23832af1558ec977d594 100644 (file)
@@ -54,10 +54,6 @@ public:
        static void *run(void *arg);
        bool join();
 
-       /* For an existing thread descriptor which is NOT running yet, assign node
-        * on which it should be running. */
-       void schedule_to_node(int node);
-
 protected:
        function<void()> run_cb_;
        std::thread thread_;