Причины медленной работы параллельных расширений

Я пытаюсь ускорить расчетное приложение с помощью параллельных расширений. Я новичок в этом, поэтому я только что заменил основной цикл foreach на Parallel.ForEach. Но расчет стал медленнее. Каковы общие причины снижения производительности параллельных расширений?

Спасибо


person darja    schedule 28.05.2010    source источник
comment
Здесь действительно недостаточно информации, чтобы ответить на ваш вопрос. Вам нужно привести конкретный пример.   -  person Ade Miller    schedule 05.01.2013


Ответы (1)


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

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

  1. Если у вас есть последовательные операции, ожидающие ресурса, например. установление TCP-соединений с сервером и загрузка данных, это может быть быстрее делать параллельно.
  2. Если у вас есть несколько процессоров/ядер, может быть быстрее выполнять каждую задачу на ядре, вместо того, чтобы использовать 100% одного ядра и ни одного другого.

Если у вас есть одно ядро ​​и множество мелких операций, дополнительная работа, необходимая для переключения контекста и выделения ресурсов, необходимых для управления параллельными потоками, может перевесить преимущества.

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

На самом деле статья Википедии о параллельных вычислениях содержит полезную информацию об этом, см. http://en.wikipedia.org/wiki/Parallel_computing

Вы хотите обратить особое внимание на закон Амдала.

person Cobusve    schedule 28.05.2010
comment
Короче говоря, у меня есть список объектов, и я пытаюсь вычислить значения некоторых свойств для каждого объекта. Объекты изолированы, нет общих переменных для вычисления. Существует статический класс для хранения констант, но его поля не изменяемы. Для расчета используется Intel Core i7. Все ядра загружены на 90-100%. Но он работает медленнее, чем однопоточный расчет с одним занятым ядром. - person darja; 28.05.2010
comment
Я предполагаю, что расчеты довольно простые тогда. Таким образом, накладные расходы на выделение ресурсов для каждого потока превышают ценность, которую вы получаете от параллельного выполнения. Сколько объектов у вас в списке? Классический способ исправить это — уменьшить накладные расходы на создание большого количества потоков до оптимального значения. Ваш I7 может, например. иметь 8 ядер, так что вы могли бы выполнять разделение работы самостоятельно. - person Cobusve; 28.05.2010
comment
Попробуйте следующее: 1. Создайте метод, вычисляющий свойства списка объектов, а не одного. 2. Напишите код, который делит ваш набор объектов на 8 списков. 3. Теперь используйте расширения Parallel для запуска 8 параллельных процессов, каждый из которых выполняет вычисления в списке. Если вы профилируете это, вы можете точно оценить дополнительные усилия, необходимые для разбиения набора данных на 8 списков, а также накладные расходы на повторение каждого списка. Если эти накладные расходы меньше, чем прирост производительности при использовании всех ядер, это улучшит вашу производительность, иначе вы просто добавите усилия (время). - person Cobusve; 28.05.2010