ОМП и ОМП параллельный параллельный
в чем разница между этими двумя?
[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)
{
...
}
6 ответов:
Я не думаю, что есть какая-то разница, один ярлык на другой. Хотя ваша точная реализация может иметь дело с ними по-разному.
комбинированные параллельные рабочие конструкции являются ярлыком для указание параллельной конструкции, содержащей одну конструкцию worksharing и никаких других заявлений. Разрешенные пункты-это объединение пунктов допускается для параллельных и рабочих конструкций.
взяты из http://www.openmp.org/mp-documents/OpenMP3.0-SummarySpec.pdf
спецификации для OpenMP здесь:
это эквивалент.
#pragma omp parallel
создает группу потоков, в то время как#pragma omp for
делит итерации цикла между порожденными потоками. Вы можете делать обе вещи сразу с помощью fused
вот пример использования
parallel
иfor
здесь. Короче говоря, он может быть использован для динамического выделения потоков 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];
серийный код (нет
openmp
) работает в 79 МС. код "parallel for" выполняется за 29 МС. Если я опущуfor
и использовать#pragma omp parallel
, время выполнения стреляет до 179 МС, что медленнее, чем серийный код. (машина имеет HW параллелизм 8)код ссылки на
libgomp
есть, очевидно, много ответов, но этот отвечает на него очень хорошо (с источником)
pragma omp только для делегатов части цикла для
различные потоки в нынешней команды. команда-это группа потоков выполнение программы. При запуске программы, Команда состоит только из один член: главный поток программы.
чтобы создать новую команду потоков, вам нужно чтобы указать параллель ключевое слово. Его можно указать в окружающем контексте:
# Pragma omp parallel { #pragma omp for for(int n=0; n
и:
что такое: параллель, Для и команда разница между параллельными, параллель Для и для выглядит следующим образом:
команда-это группа потоков что выполнить в настоящее время. В начале программы, Команда состоять из один поток. Параллельной конструкции разделяет поток в новая команда потоков на время следующего блока / оператора, после чего команда сливается в одно. для делит работу for-петля среди потоков текущей команды.
Он не создает нити, он только делит работу между потоками в настоящее время команда исполнителей. parallel for-это стенография для двух команд сразу: параллельно и для себя. Параллельное создание новая команда, и для расколов это команда для обработки различных частей цикла. Если ваша программа никогда содержит параллельную конструкцию, никогда не бывает более одного потока; главный поток, который запускает программу и запускает ее, как в непоточные программы.