Параметр omp parallel vs. omp параллелен для
В чем разница между этими двумя?
[А]
#pragma omp parallel
{
#pragma omp for
for(int i = 1; i < 100; ++i)
{
...
}
}
[В]
#pragma omp parallel for
for(int i = 1; i < 100; ++i)
{
...
}
Ответы
Ответ 1
Я не думаю, что есть какая-то разница, одна из них - ярлык для другого. Хотя ваша конкретная реализация может иметь дело с ними по-разному.
Комбинированные параллельные конструкторы совместной работы являются ярлыком для указания параллельной конструкции, содержащей одну конструкцию работы без каких-либо других операторов. Допустимые оговорки - это объединение предложений, разрешенных для параллельных и коллективных договоров.
Взято с http://www.openmp.org/mp-documents/OpenMP3.0-SummarySpec.pdf
Спецификации для OpenMP находятся здесь:
https://openmp.org/specifications/
Ответ 2
Они эквивалентны.
#pragma omp parallel
порождает группу потоков, а #pragma omp for
делит петлевые итерации цикла между порожденными потоками. Вы можете делать обе вещи сразу с помощью плавной директивы #pragma omp parallel for
.
Ответ 3
Ниже приведен пример использования разделенных parallel
и for
здесь. Короче говоря, он может использоваться для динамического распределения потоков private-массивов OpenMP перед выполнением цикла for
в нескольких потоках.
Невозможно выполнить ту же инициализацию в случае parallel for
.
UPD:
В примере вопроса нет разницы между одной прагмой и двумя прагмами. Но на практике вы можете создавать более техобеспечивающие отношения с отдельными параллельными и для директив.
Например, код:
#pragma omp parallel
{
double *data = (double*)malloc(...); // this data is thread private
#pragma omp for
for(1...100) // first parallelized cycle
{
}
#pragma omp single
{} // make some single thread processing
#pragma omp for // second parallelized cycle
for(1...100)
{
}
#pragma omp single
{} // make some single thread processing again
free(data); // free thread private data
}
Ответ 4
Хотя обе версии конкретного примера эквивалентны, как уже упоминалось в других ответах, между ними по-прежнему существует небольшая разница. Первая версия включает в себя ненужный неявный барьер, встречающийся в конце "omp for". Другой неявный барьер можно найти в конце параллельной области. Добавление "nowait" в "omp for" приведет к тому, что эти два эквивалента эквивалентны, по крайней мере, с точки зрения OpenMP. Я упоминаю об этом, потому что компилятор OpenMP может генерировать несколько другой код для двух случаев.
Ответ 5
Я вижу совершенно разные времена выполнения, когда беру цикл for в g++ 4.7.0
и используя
std::vector<double> x;
std::vector<double> y;
std::vector<double> prod;
for (int i = 0; i < 5000000; i++)
{
double r1 = ((double)rand() / double(RAND_MAX)) * 5;
double r2 = ((double)rand() / double(RAND_MAX)) * 5;
x.push_back(r1);
y.push_back(r2);
}
int sz = x.size();
#pragma omp parallel for
for (int i = 0; i< sz; i++)
prod[i] = x[i] * y[i];
серийный код (no openmp
) работает в 79 мс.
код "parallel for" работает в 29 мс.
Если я опускаю for
и использую #pragma omp parallel
, время выполнения увеличивается до 179 мс,
который медленнее, чем серийный код. (машина имеет hw concurrency of 8)
ссылки на libgomp
Ответ 6
Очевидно, есть много ответов, но этот ответ очень хорошо (с исходным кодом)
pragma omp только делегирует части цикла для
различные потоки в текущей команде. Команда - это группа потоков, выполняющих программу. При запуске программы команда состоит только из одного члена: главного потока, который запускает программу.
Чтобы создать новую группу потоков, вам нужно указать ключевое слово parallel. Он может быть указан в окружающем контексте:
#pragma omp parallel {#pragma omp for for (int n = 0; n <10; ++n) printf ("% d", n); }
а также:
Что такое: параллель, для и команда. Разница между параллелью, параллелью и для выглядит следующим образом:
Команда - это группа потоков, которые выполняются в настоящее время. В начале программы команда состоит из одного потока. Параллельная конструкция разделяет текущий поток на новую команду потоков на время следующего блока/оператора, после чего команда объединяется обратно в одну. для деления работы цикла for между потоками текущей команды.
Он не создает потоки, он только делит работу между потоками текущей исполняющей команды. parallel for - сокращенно для двух команд одновременно: параллельно и для. Параллель создает новую команду и разбивает эту команду на обработку различных частей цикла. Если ваша программа никогда не содержит параллельную конструкцию, существует не более одного потока; основной поток, который запускает программу и запускает ее, как в программах, не связанных с потоками.
https://bisqwit.iki.fi/story/howto/openmp/