В чем разница между этими двумя?
[A]
#pragma omp parallel
{
#pragma omp for
for(int i = 1; i < 100; ++i)
{
...
}
}
[B]
#pragma omp parallel for
for(int i = 1; i < 100; ++i)
{
...
}
Я не думаю, что есть какая-то разница, одно - ярлык для другого. Хотя ваша точная реализация может относиться к ним по-другому.
Комбинированные конструкции параллельной совместной работы - это ярлык для указания параллельной конструкции, содержащей одну конструкцию совместной работы и никаких других операторов. Разрешенные пункты - это совокупность пунктов, разрешенных для параллельных договоров и договоров о совместной работе.
Взято с http://www.openmp.org/mp-documents/OpenMP3.0-SummarySpec.pdf
Спецификации OpenMP находятся здесь:
Они эквивалентны.
#pragma omp parallel
порождает группу потоков, #pragma omp for
разделяя итерации цикла между порожденными потоками. С помощью #pragma omp parallel for
директивы fused вы можете делать обе вещи одновременно .
schedule(static, chunk)
предложение в директиве, у меня возникает проблема. Код работает нормально, но когда я вызываю этот код из программы MPI, он заходит в бесконечный цикл. Счетчик цикла равен нулю на всех итерациях этого цикла. У меня счетчик циклов определен как частный в#pragma omp parallel
директиве. Понятия не имею, почему это не удается только тогда, когда MPI вызывает код. Я в некоторой степени уверен, что каждый процесс MPI выполняется на другом процессоре кластера, если это имеет значение. Понятия не имею, является ли расписание причиной проблемы.#pragma omp parallel for
директиву. Должна быть какая-то разница.Вот пример использования разделенных
parallel
иfor
здесь . Вкратце, его можно использовать для динамического выделения частных массивов потоков OpenMP перед выполнениемfor
цикла в нескольких потоках. Вparallel for
случае, если такую же инициализацию сделать невозможно .UPD: В примере вопроса нет разницы между одной прагмой и двумя прагмами. Но на практике вы можете сделать более ориентированное на поток поведение с разделенными директивами parallel и for. Какой-то код, например:
источник
Хотя обе версии конкретного примера эквивалентны, как уже упоминалось в других ответах, между ними все же есть одно небольшое различие. Первая версия включает ненужный неявный барьер, встречающийся в конце "omp for". Другой неявный барьер можно найти в конце параллельной области. Добавление nowait к omp for сделало бы два кода эквивалентными, по крайней мере, с точки зрения OpenMP. Я упоминаю об этом, потому что компилятор OpenMP может генерировать немного другой код для этих двух случаев.
источник
Я вижу совершенно разные времена выполнения, когда беру цикл for в g ++ 4.7.0 и использую
серийный код (нет
openmp
) запускается через 79 мс. код "parallel for" выполняется за 29 мс. Если я опущуfor
и использую#pragma omp parallel
, время выполнения увеличится до 179 мс, что медленнее, чем последовательный код. (машина имеет параллелизм 8)код ссылается на
libgomp
источник
#pragma omp for
вообще нет многопоточного разделения цикла. Но в любом случае это был не случай OP, попробуйте еще раз с дополнительным#pragma omp for
внутри,#pragm omp parallel
и он должен работать аналогично (если не так), как#pragma omp parallel for
версия.Очевидно, существует множество ответов, но этот отвечает очень хорошо (с исходным кодом)
и:
https://bisqwit.iki.fi/story/howto/openmp/
источник