Фон
У меня есть фрагмент кода, который хорошо распараллеливается, и я обнаружил, что большую часть времени я использую только одно ядро на 100%, а остальные ничего не делают. Чтобы решить эту проблему, я возился с многопоточностью, реализацией семафоров и тем, что не осознавал, что Parallel.For() является мелкозернистым и более эффективным, чем любое из моих решений.
Кодекс
Для упрощения я буду писать только структурно важные фрагменты кода.
int sharedResource = 0;
for (int i = 0; i < someMax; i++)
{
for (int j = 0; j <= i; j++)
{
if (someCondition(i, j))
sharedResource += someFunction(i, j);
else break;
}
}
Все неоднозначно названные функции являются более или менее просто математическими уравнениями и имеют временную сложность O(1).
Важные детали
Обратите внимание на внутренний цикл, в котором переменная i является верхней границей, а также переменная суммирования с именем sharedResource. . Порядок выполнения в этом случае не важен, так как сложение является коммутативным, и я не вижу никакой очевидной причины для применения закона Амдала, поскольку все комбинации экземпляров (i, j) обоих циклов могут быть вычислены независимо. .
Вопрос
Разумно ли использовать вложенный цикл Parallel.For() в этом сценарии или мне следует использовать его только вместо внешнего цикла (или только во внутреннем цикле соответственно)?
Единственное, что меня беспокоит, это sharedResource, так как я не очень хорошо понимаю, как работает Parallel.For() из документации. Еще одна важная вещь заключается в том, что если я использую два цикла Parallel.For(), некоторые экземпляры завершатся почти мгновенно из-за break, в то время как другим потребуется гораздо больше времени. Удастся ли это сбалансировать?
ConcurrentBag<int>
(при условии, что ваш общий ресурс имеет тип int), который является потокобезопасным, и добавьте свои результаты в корзину. После завершенияParallel.For
- просуммируйте результаты. - person Vidmantas Blazevicius   schedule 24.03.2018Because it might work false positively and I need a concrete answer.
Итак, если вы скажете, что делаете это так, вы будете кодировать это и считать, что это правильно? Лучше сначала попробовать, а затем задать свой вопрос с кодами, которые вы пробовали до сих пор. - person Eser   schedule 24.03.2018