Ограничить количество потоков, используемых в Concurrency::parallel_for

Как ограничить количество потоков, используемых в

Concurrency::parallel_for<int>(0, 100, 1, [&](int k) 

Я видел идею планировщика/задачи, я не могу ее использовать, потому что внутри параллели много логики и мне нужно передавать аргументы, все примеры для задач содержат только std::cout‹‹Hey‹‹std: :конец; внутри задачи.

Надеюсь, у вас есть идеи.

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
}
}

person InUser    schedule 07.07.2021    source источник
comment
Ограничить чем? 1 очень, очень легко. ;)   -  person Yakk - Adam Nevraumont    schedule 07.07.2021
comment
Количество потоков, не зависящее от количества процессоров (меньше)   -  person InUser    schedule 07.07.2021
comment
Где было определено Concurrency?   -  person zkoza    schedule 10.07.2021
comment
я не уверен, что понимаю вас, использование ели внутри функции, я не делал никаких специальных предопределений   -  person InUser    schedule 10.07.2021
comment
Вы сказали, что не можете использовать его, потому что внутри параллели, потому что там много логики, и мне нужно передать аргументы. В этом случае обычно помогает, если вы предоставляете минимально воспроизводимый пример, демонстрирующий именно такой случай. В противном случае неясно, что не делает это дубликатом, например. Как установить количество потоков PPL равным одному? или PPL — Как настроить количество собственных потоков?   -  person He3lixxx    schedule 10.07.2021
comment
Я не уверен, что понял ваш вопрос. Вы всегда можете определить глобальную переменную, действующую как семафор, который проверяется прямо при входе в функцию, чтобы проверить, достигнут ли требуемый предел одновременного вызова функции.   -  person Bilal Qandeel    schedule 13.07.2021


Ответы (2)


Вы имеете в виду https://docs.microsoft.com/en-us/cpp/parallel/concrt/reference/concurrency-namespace-functions?view=msvc-160#parallel_for.

Я не думаю, что для этого есть супер простое решение для вызова одной функции. Согласно документам, вам необходимо изменить политику текущего планировщика, чтобы любой запускаемый вами 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

person Sean Walker    schedule 16.07.2021

Я не использовал интерфейс, но следующее может сработать (при условии, что 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

person Hans Olsson    schedule 16.07.2021
comment
Мне нравится эта простая идея, и я попробую, спасибо! Обновление в ближайшее время. - person InUser; 18.07.2021