如何限制在
Concurrency::parallel_for<int>(0, 100, 1, [&](int k) 我看到了调度器/任务的想法,我没有在并行中使用它,因为有很多逻辑,我需要传递参数,任务的所有示例都只包含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
}
}发布于 2021-07-16 07:30:07
我还没有使用该接口--但下面的操作可能会工作(假设有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://learn.microsoft.com/en-us/cpp/parallel/concrt/reference/simple-partitioner-class?view=msvc-160 https://learn.microsoft.com/en-us/cpp/parallel/concrt/reference/concurrency-namespace-functions?view=msvc-160#parallel_for上找到。
发布于 2021-07-16 06:10:46
我不认为有一个超级简单的“一个函数调用”解决方案。根据文档,您需要更改当前调度程序的策略,以便您运行的任何parallel_for都受到调度程序的限制,只能使用特定数量的资源。因此,您需要获取当前的SchedulerPolicy,更新它的SetConcurrencyLimits(),然后通过使用修改的策略调用并发性::CurrentScheduler::Create()来更新当前策略。这应该允许您在执行parallel_for时限制总线程数。当您完成调用时,您肯定需要进行实验和测试,包括禁用您修改的调度策略。
重构代码(即parallel_for调用的块,以便每个parallel_for只执行要执行的并发线程的数量)可能更容易。这将降低效率,但可能更容易编写和维护。
参考文献:
https://learn.microsoft.com/en-us/cpp/parallel/concrt/reference/schedulerpolicy-class?view=msvc-160
https://learn.microsoft.com/en-us/cpp/parallel/concrt/scheduler-instances?view=msvc-160
https://stackoverflow.com/questions/68288476
复制相似问题