Каноническим вариантом использования OpenMP является распределение между командой потоков итераций цикла с большим числом итераций с условием, что итерации цикла не имеют прямых или косвенных зависимостей.
Вы можете понять, что я имею в виду под прямыми зависимостями, ответив на вопрос Влияет ли порядок выполнения итераций цикла на результаты?. Если, например, итерация N+1 использует результаты итерации N, у вас есть такая зависимость, выполнение итераций цикла в обратном порядке изменит вывод процедуры.
Под косвенными зависимостями я подразумеваю в основном гонки данных, в которых потоки должны координировать свой доступ к общим данным, в частности, они должны гарантировать, что запись в общие переменные происходит в правильной последовательности.
Во многих случаях вы можете перепроектировать цикл с зависимостями, чтобы удалить эти зависимости.
ЕСЛИ у вас есть цикл с большим количеством итераций, который не имеет таких зависимостей, ТОГДА у вас есть кандидат на хорошее ускорение с OpenMP. Вот но:
- В начале и в конце каждого такого цикла возникают некоторые параллельные накладные расходы, и если количество циклов недостаточно велико, эти накладные расходы могут частично или полностью перевешивать ускорение параллельного выполнения итераций. Единственный способ определить, влияет ли это на ваш код, — протестировать и измерить.
- Между итерациями цикла могут быть более тонкие зависимости, чем я уже описал. В зависимости от архитектуры вашей системы и вычислений внутри цикла вы можете (не осознавая этого) запрограммировать свои потоки на борьбу за доступ к кешу, ресурсам ввода-вывода или любому другому ресурсу. В худшем случае это может привести к увеличению количества потоков, что приведет к снижению скорости выполнения.
- Вы должны убедиться, что каждый поток OpenMP поддерживается аппаратным обеспечением, а не псевдоаппаратным обеспечением, которое представляет гиперпоточность. Одно ядро на поток OpenMP, гиперпоточность в этой области — змеиное масло.
- Я ожидаю, что здесь есть и другие но, возможно, кто-то еще поможет.
Теперь, что касается ваших вопросов:
- Стоит ли мне в любом случае использовать параллельный код? Протестируйте и измерьте.
- Правда ли, что эффективность распараллеливания будет увеличиваться с увеличением количества циклов for? Приблизительно, но для вашего кода на вашем оборудовании проверьте и измерьте.
Наконец, вы не сможете стать серьезным специалистом по параллельным вычислениям, если не измерите время выполнения при различных сочетаниях обстоятельств и не узнаете, о чем говорят ваши измерения. Если вы не можете сравнить последовательное и параллельное выполнение для огромных объемов данных, вам придется измерить их для скромных объемов данных и понять извлеченные уроки, прежде чем делать прогнозы о поведении при работе с огромными объемами данных.
person
High Performance Mark
schedule
26.06.2012