Вложенная параллельная скорость.

У меня есть замкнутый цикл. Я заменил первый For с Parallel.For(), и скорость вычисления увеличилась.

Мой вопрос заключается в замене второго на (внутри) на Parallel.For(). Увеличит ли скорость? или нет разницы? или он будет медленнее?

Изменить:

Поскольку ядра не являются неограниченными (обычно от 2 до 8 ядер), внутренний цикл работает параллельно. Итак, если я изменил внутри с помощью Parallel.For(), снова он будет работать параллельно. Но я не уверен, как это изменяет производительность и скорость.

Ответ 1

В разделе "Слишком мелкозернистый, слишком грубозернистый" раздел "Анти-шаблоны" в "Шаблоны параллельного программирования" книга .NET команда параллельных вычислений:

Ответ заключается в том, что наилучший баланс достигается за счет производительности тестирование. Если накладные расходы на распараллеливание минимальны по сравнению к выполняемой работе, распараллеливать как можно больше: в этом случае, это означало бы распараллеливание обеих петель. Если накладные расходы распараллеливание внутреннего цикла приведет к снижению производительности на большинстве системы, подумайте дважды, прежде чем делать это, так как это, вероятно, будет лучше всего распараллеливать внешний контур.

Взгляните на этот подраздел, он является самодостаточным с подробными примерами из приложения трассировки параллельных лучей. И его предложение сгладить петли, чтобы иметь более высокую степень parallelism, может оказаться полезным и для вас.

Ответ 2

Это снова зависит от многих сценариев,

  • Количество параллельных потоков, которые может выполнять ваш процессор.
  • Число итераций.

Если ваш процессор является одноядерным процессором, вы не получите никаких преимуществ.

Если число итераций больше, вы получите некоторые улучшения.

Если есть несколько итераций, это будет медленным, поскольку это связано с дополнительной перегрузкой.

Ответ 3

Это зависит от данных и функций, которые вы используете внутри и для машины. В последнее время я возился с parallel.for и parallel.foreach и узнал, что они сделали мои приложения еще медленнее... (на 4-х основных машинах, возможно, если у вас есть 24-ядерный сервер, это еще одна история)

Я думаю, что управление потоками означает слишком много накладных расходов...

Даже MS в своей документации (здесь очень длинный pdf на msdn об этом http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=19222) допускает, что он не ускоряет работу приложений, Вы должны попробовать каждый раз, и если это работает, здорово, а если не плохо.

Вы должны попробовать внешний и внутренний, но, по крайней мере, в приложениях, которые я попробовал, ни один из них не ускорил приложение. Внешний или внутренний не имел большого значения, я просто получал одинаковое время выполнения или даже хуже.

Возможно, если вы также используете коллекцию Concurrent, вы получите лучшую производительность. Но опять же, не пытаясь сказать, не может сказать.

EDIT:

Я просто нашел хорошую ссылку на MSDN, которая оказалась очень полезной (в моем случае) для улучшения производительности Parallel.foreach http://msdn.microsoft.com/en-us/library/dd560853.aspx