Add UI control for MuJoCo threadpool size.

PiperOrigin-RevId: 923860258
Change-Id: I11dc5d7904f1c3657d7e1dd2b0e3c7864c0c7ead
This commit is contained in:
Yuval Tassa
2026-05-30 03:40:59 -07:00
committed by Copybara-Service
parent 96bf8aea81
commit d7e872b6f9
2 changed files with 20 additions and 0 deletions
+18
View File
@@ -28,6 +28,7 @@
#include <span> #include <span>
#include <string> #include <string>
#include <string_view> #include <string_view>
#include <thread>
#include <utility> #include <utility>
#include <vector> #include <vector>
@@ -227,6 +228,7 @@ void App::OnModelLoaded(std::string filename, ModelKind model_kind) {
plugin->post_model_loaded(plugin, model_path_.c_str()); plugin->post_model_loaded(plugin, model_path_.c_str());
} }
}); });
tmp_.update_threadpool = true;
} }
void App::UpdateFilePaths(const std::string& resolved_path) { void App::UpdateFilePaths(const std::string& resolved_path) {
@@ -268,6 +270,11 @@ void App::UpdatePhysics() {
return; return;
} }
if (tmp_.update_threadpool) {
mju_threadpool(data(), ui_.nthread);
tmp_.update_threadpool = false;
}
bool stepped = false; bool stepped = false;
platform::ForEachPlugin<platform::ModelPlugin>([&](auto* plugin) { platform::ForEachPlugin<platform::ModelPlugin>([&](auto* plugin) {
if (plugin->do_update) { if (plugin->do_update) {
@@ -1457,6 +1464,15 @@ void App::ToolBarGui() {
ImGui::SameLine(0, separator_width); ImGui::SameLine(0, separator_width);
platform::StepControlGui(model(), &step_control_, tmp_.speed_index); platform::StepControlGui(model(), &step_control_, tmp_.speed_index);
ImGui::SameLine(0, separator_width);
ImGui::SetNextItemWidth(120);
ImGui::BeginDisabled(std::thread::hardware_concurrency() <= 1);
if (ImGui::SliderInt("##NumThreads", &ui_.nthread, 0, 8, "%d threads")) {
tmp_.update_threadpool = true;
}
ImGui::EndDisabled();
ImGui::SetItemTooltip("%s", "Number of threads in threadpool");
ImGui::TableNextColumn(); ImGui::TableNextColumn();
platform::CameraSelectionGui(model(), data(), camera_, ui_.camera_idx); platform::CameraSelectionGui(model(), data(), camera_, ui_.camera_idx);
@@ -1823,6 +1839,7 @@ App::UiState::Dict App::UiState::ToDict() const {
{"font_scale", std::to_string(font_scale)}, {"font_scale", std::to_string(font_scale)},
{"window_width", std::to_string(window_width)}, {"window_width", std::to_string(window_width)},
{"window_height", std::to_string(window_height)}, {"window_height", std::to_string(window_height)},
{"nthread", std::to_string(nthread)},
}; };
} }
@@ -1834,5 +1851,6 @@ void App::UiState::FromDict(const Dict& dict) {
window_width = ReadIniValue(dict, "window_width", window_width); window_width = ReadIniValue(dict, "window_width", window_width);
window_height = ReadIniValue(dict, "window_height", window_height); window_height = ReadIniValue(dict, "window_height", window_height);
font_scale = ReadIniValue(dict, "font_scale", font_scale); font_scale = ReadIniValue(dict, "font_scale", font_scale);
nthread = ReadIniValue(dict, "nthread", nthread);
} }
} // namespace mujoco::studio } // namespace mujoco::studio
+2
View File
@@ -114,6 +114,7 @@ class App {
float font_scale = 1.0f; float font_scale = 1.0f;
int window_width = 0; int window_width = 0;
int window_height = 0; int window_height = 0;
int nthread = 0;
using Dict = std::unordered_map<std::string, std::string>; using Dict = std::unordered_map<std::string, std::string>;
Dict ToDict() const; Dict ToDict() const;
@@ -124,6 +125,7 @@ class App {
struct UiTempState { struct UiTempState {
bool should_exit = false; bool should_exit = false;
bool first_frame = true; bool first_frame = true;
bool update_threadpool = false;
// Windows. // Windows.
bool help = false; bool help = false;