限制 Concurrency::parallel_for 中使用的线程数
Limit number of threads used in Concurrency::parallel_for
如何限制
中使用的线程数
Concurrency::parallel_for<int>(0, 100, 1, [&](int k)
我看到了 scheduler/task 的想法,但我没有使用它,因为在并行中有很多逻辑,我需要传递参数,任务的所有示例只包含 std::cout<<"嘿"<
希望你有一些想法。
bool func1(int x,int y....) //A lot of params{
Concurrency::parallel_for<int>(0, 100, 1, [&](int k) {
//a lot of logic depends on the input
}
}
我认为对此没有超级简单的“一个函数调用”解决方案。根据文档,您需要更改当前调度程序的策略,以便任何 parallel_for 您 运行 都受到调度程序的限制,只能使用特定数量的资源。因此,您希望获取当前的 SchedulerPolicy,对其更新 SetConcurrencyLimits(),然后通过使用修改后的策略调用 concurrency::CurrentScheduler::Create() 来更新当前策略。这应该让您在 parallel_for 执行时限制总线程数。您肯定需要进行试验和测试,包括在完成调用后禁用修改后的调度策略。
重组您的代码可能更容易(即分块 parallel_for 调用,以便每个 parallel_for 只执行您要执行的并发线程数)。这会降低效率,但可能更容易编写和维护。
参考文献:
https://docs.microsoft.com/en-us/cpp/parallel/concrt/reference/schedulerpolicy-class?view=msvc-160
https://docs.microsoft.com/en-us/cpp/parallel/concrt/scheduler-instances?view=msvc-160
我没有使用过该界面 - 但以下可能有效(假设 8 个工作人员和并行 100 个案例 - 否则调整 100/8)。
Concurrency::simple_partitioner splitter(100/8);
Concurrency::parallel_for<int>(0, 100, 1, [&](int k) {
//a lot of logic depends on the input
}, splitter);
这不是直接限制线程数,而是分块数据实现相同。
这个想法也可以在:
https://katyscode.wordpress.com/2013/08/17/c11-multi-core-programming-ppl-parallel-aggregation-explained/
https://docs.microsoft.com/en-us/cpp/parallel/concrt/reference/simple-partitioner-class?view=msvc-160
https://docs.microsoft.com/en-us/cpp/parallel/concrt/reference/concurrency-namespace-functions?view=msvc-160#parallel_for
如何限制
中使用的线程数Concurrency::parallel_for<int>(0, 100, 1, [&](int k)
我看到了 scheduler/task 的想法,但我没有使用它,因为在并行中有很多逻辑,我需要传递参数,任务的所有示例只包含 std::cout<<"嘿"< 希望你有一些想法。bool func1(int x,int y....) //A lot of params{
Concurrency::parallel_for<int>(0, 100, 1, [&](int k) {
//a lot of logic depends on the input
}
}
我认为对此没有超级简单的“一个函数调用”解决方案。根据文档,您需要更改当前调度程序的策略,以便任何 parallel_for 您 运行 都受到调度程序的限制,只能使用特定数量的资源。因此,您希望获取当前的 SchedulerPolicy,对其更新 SetConcurrencyLimits(),然后通过使用修改后的策略调用 concurrency::CurrentScheduler::Create() 来更新当前策略。这应该让您在 parallel_for 执行时限制总线程数。您肯定需要进行试验和测试,包括在完成调用后禁用修改后的调度策略。
重组您的代码可能更容易(即分块 parallel_for 调用,以便每个 parallel_for 只执行您要执行的并发线程数)。这会降低效率,但可能更容易编写和维护。
参考文献:
https://docs.microsoft.com/en-us/cpp/parallel/concrt/reference/schedulerpolicy-class?view=msvc-160
https://docs.microsoft.com/en-us/cpp/parallel/concrt/scheduler-instances?view=msvc-160
我没有使用过该界面 - 但以下可能有效(假设 8 个工作人员和并行 100 个案例 - 否则调整 100/8)。
Concurrency::simple_partitioner splitter(100/8);
Concurrency::parallel_for<int>(0, 100, 1, [&](int k) {
//a lot of logic depends on the input
}, splitter);
这不是直接限制线程数,而是分块数据实现相同。
这个想法也可以在: https://katyscode.wordpress.com/2013/08/17/c11-multi-core-programming-ppl-parallel-aggregation-explained/ https://docs.microsoft.com/en-us/cpp/parallel/concrt/reference/simple-partitioner-class?view=msvc-160 https://docs.microsoft.com/en-us/cpp/parallel/concrt/reference/concurrency-namespace-functions?view=msvc-160#parallel_for