2017-02-08 4 views
2

Предполагая, что вы разработали последовательную программу с вложенными циклами и хотели бы преобразовать ее параллельно с OpenMP и работать над ней в разделах для отладки, когда вы идете ... было бы лучше сначала работайте с самым внешним контуром и прокладывайте себе путь, или начинайте с самого внутреннего цикла (ов)? Я знаю функцию коллапса, но не все вложенные петли сбрасываются.OpenMP, стратегия разработки вложенных циклов

+1

Это довольно широкий вопрос. В рекомендации есть много факторов. Можете ли вы сузить его, предоставив некоторые подробности без общего вложенного цикла, наиболее предпочтительно в виде реального кода. – Zulan

+0

BTW: Я бы сказал, насколько возможно внешний, как внутренний. Но я бы не счел это полезным ответом. – Zulan

+0

Некоторые вложенные петли, которые не могут быть свернуты с условием 'collapse', все равно могут быть свернуты вручную, например. треугольные петли. Полезно узнать, как все равно рубить петли. –

ответ

0

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

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

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

С другой стороны, если у вас есть такая сложная проблема, я рекомендую вам использовать низкоуровневый std::thread и управлять потоками вручную. Это требует больше работы, но у вас больше контроля и лучших результатов. Затем вы можете использовать пулы потоков и иметь наиболее эффективное решение.

+0

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

+0

Матрицы должны храниться как одномерные векторы. Это самый эффективный способ сделать это. Подумайте о том, как использовать высокопроизводительные библиотеки, такие как OpenBLAS (или их обертки, такие как Armadillo). Вы не должны изобретать колесо. Матричные операции - огромное поле. –

+0

Я сейчас в классах, и обычно мы должны использовать определенные библиотеки только для определенных проектов. 2D-векторы подходят для этого задания (и то, что нам было поручено использовать) – theupandup

Смежные вопросы