В чем разница между этими двумя?
[А]
#pragma omp parallel
{
#pragma omp for
for(int i = 1; i < 100; ++i)
{
...
}
}
[В]
#pragma omp parallel for
for(int i = 1; i < 100; ++i)
{
...
}
В чем разница между этими двумя?
[А]
#pragma omp parallel
{
#pragma omp for
for(int i = 1; i < 100; ++i)
{
...
}
}
[В]
#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
.
Ниже приведен пример использования разделенных 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
}
Хотя обе версии конкретного примера эквивалентны, как уже упоминалось в других ответах, между ними по-прежнему существует небольшая разница. Первая версия включает в себя ненужный неявный барьер, встречающийся в конце "omp for". Другой неявный барьер можно найти в конце параллельной области. Добавление "nowait" в "omp for" приведет к тому, что эти два эквивалента эквивалентны, по крайней мере, с точки зрения OpenMP. Я упоминаю об этом, потому что компилятор OpenMP может генерировать несколько другой код для двух случаев.
Я вижу совершенно разные времена выполнения, когда беру цикл 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
Очевидно, есть много ответов, но этот ответ очень хорошо (с исходным кодом)
pragma omp только делегирует части цикла для
различные потоки в текущей команде. Команда - это группа потоков, выполняющих программу. При запуске программы команда состоит только из одного члена: главного потока, который запускает программу.
Чтобы создать новую группу потоков, вам нужно указать ключевое слово parallel. Он может быть указан в окружающем контексте:
#pragma omp parallel {#pragma omp for for (int n = 0; n <10; ++n) printf ("% d", n); }
а также:
Что такое: параллель, для и команда. Разница между параллелью, параллелью и для выглядит следующим образом:
Команда - это группа потоков, которые выполняются в настоящее время. В начале программы команда состоит из одного потока. Параллельная конструкция разделяет текущий поток на новую команду потоков на время следующего блока/оператора, после чего команда объединяется обратно в одну. для деления работы цикла for между потоками текущей команды.
Он не создает потоки, он только делит работу между потоками текущей исполняющей команды. parallel for - сокращенно для двух команд одновременно: параллельно и для. Параллель создает новую команду и разбивает эту команду на обработку различных частей цикла. Если ваша программа никогда не содержит параллельную конструкцию, существует не более одного потока; основной поток, который запускает программу и запускает ее, как в программах, не связанных с потоками.