32 namespace scheduler_utils
35 std::pair<unsigned, unsigned>
split_2d(
unsigned max_threads, std::size_t m, std::size_t n)
47 double ratio = m /
static_cast<double>(n);
50 const unsigned adjusted =
std::round(std::sqrt(max_threads * ratio));
53 for (
unsigned i = 0; i != adjusted; ++i)
56 const unsigned adj_down = adjusted - i;
57 if (max_threads % adj_down == 0)
59 return {adj_down, max_threads / adj_down};
63 const unsigned adj_up = adjusted + i;
64 if (max_threads % adj_up == 0)
66 return {adj_up, max_threads / adj_up};
73 return {std::min<unsigned>(m, max_threads), 1};
77 return {1, std::min<unsigned>(n, max_threads)};