Вложенный Parallel.For () обеспечивает высокую скорость и производительность - PullRequest
12 голосов
/ 10 января 2012

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

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

Редактировать:

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

Ответы [ 3 ]

15 голосов
/ 10 января 2012

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

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

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

3 голосов
/ 10 января 2012

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

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

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

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

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

1 голос
/ 10 января 2012

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

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

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

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

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

EDIT:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...