Эффективность распараллеливания openMP

У меня есть код C++, содержащий множество циклов for, распараллеленных с openMP на 8-поточном компьютере.

Но скорость выполнения с одним потоком выше, чем с параллельным 8 потоком. Мне сказали, что если нагрузка на циклы for увеличится, распараллеливание станет эффективным.

Здесь под нагрузкой я имею в виду, например, максимальное количество итераций цикла. Дело в том, что у меня нет возможности сравнить одно- и восьмипоточный параллельный код для огромного количества данных.

Должен ли я использовать параллельный код в любом случае? Правда ли, что эффективность распараллеливания будет увеличиваться с увеличением количества циклов for?


person Shibli    schedule 26.06.2012    source источник
comment
Ваш вопрос слишком широк и не подходит для SO. Попробуйте сузить его и предоставить несколько примеров кода.   -  person Hristo Iliev    schedule 27.06.2012


Ответы (1)


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

Вы можете понять, что я имею в виду под прямыми зависимостями, ответив на вопрос Влияет ли порядок выполнения итераций цикла на результаты?. Если, например, итерация N+1 использует результаты итерации N, у вас есть такая зависимость, выполнение итераций цикла в обратном порядке изменит вывод процедуры.

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

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

ЕСЛИ у вас есть цикл с большим количеством итераций, который не имеет таких зависимостей, ТОГДА у вас есть кандидат на хорошее ускорение с OpenMP. Вот но:

  • В начале и в конце каждого такого цикла возникают некоторые параллельные накладные расходы, и если количество циклов недостаточно велико, эти накладные расходы могут частично или полностью перевешивать ускорение параллельного выполнения итераций. Единственный способ определить, влияет ли это на ваш код, — протестировать и измерить.
  • Между итерациями цикла могут быть более тонкие зависимости, чем я уже описал. В зависимости от архитектуры вашей системы и вычислений внутри цикла вы можете (не осознавая этого) запрограммировать свои потоки на борьбу за доступ к кешу, ресурсам ввода-вывода или любому другому ресурсу. В худшем случае это может привести к увеличению количества потоков, что приведет к снижению скорости выполнения.
  • Вы должны убедиться, что каждый поток OpenMP поддерживается аппаратным обеспечением, а не псевдоаппаратным обеспечением, которое представляет гиперпоточность. Одно ядро ​​на поток OpenMP, гиперпоточность в этой области — змеиное масло.
  • Я ожидаю, что здесь есть и другие но, возможно, кто-то еще поможет.

Теперь, что касается ваших вопросов:

  • Стоит ли мне в любом случае использовать параллельный код? Протестируйте и измерьте.
  • Правда ли, что эффективность распараллеливания будет увеличиваться с увеличением количества циклов for? Приблизительно, но для вашего кода на вашем оборудовании проверьте и измерьте.

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

person High Performance Mark    schedule 26.06.2012