omp параллель против omp параллель для - PullRequest
94 голосов
/ 19 сентября 2009

В чем разница между этими двумя?

[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 ]

59 голосов
/ 01 октября 2009

Я не думаю, что есть какая-то разница, один является ярлыком для другого. Хотя ваша точная реализация может иметь с ними дело иначе.

Комбинированные параллельные рабочие структуры являются ярлыком для указание параллельной конструкции, содержащей одну конструкцию совместного использования и никаких других заявлений. Разрешенные пункты являются объединением пунктов. разрешено для параллельного и совместного использования контрактов.

Взято из http://www.openmp.org/mp-documents/OpenMP3.0-SummarySpec.pdf

Спецификации для OpenMP здесь:

https://openmp.org/specifications/

57 голосов
/ 26 сентября 2011

Это эквивалентно.

#pragma omp parallel порождает группу потоков, тогда как #pragma omp for делит итерации цикла между порожденными потоками. Вы можете сделать обе вещи одновременно с помощью директивы fused #pragma omp parallel for.

25 голосов
/ 24 августа 2013

Вот пример использования разделенных 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
}
8 голосов
/ 12 июля 2016

Хотя обе версии конкретного примера эквивалентны, как уже упоминалось в других ответах, между ними все еще есть одно небольшое отличие. Первая версия включает в себя ненужный неявный барьер, встречающийся в конце «omp for». Другой неявный барьер может быть найден в конце параллельной области. Добавление «nowait» к «omp for» сделает эти два кода эквивалентными, по крайней мере, с точки зрения OpenMP. Я упоминаю об этом, потому что компилятор OpenMP может генерировать немного различный код для двух случаев.

5 голосов
/ 23 июня 2012

Я вижу совершенно другое время выполнения, когда беру цикл 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 мс. код «параллельно для» выполняется за 29 мс. Если я опускаю for и использую #pragma omp parallel, время выполнения снимает до 179 мс, который медленнее, чем последовательный код. (машина имеет hw параллелизма 8)

код ссылки на libgomp

4 голосов
/ 31 июля 2018

Очевидно, что существует множество ответов, но этот отвечает очень хорошо (с источником)

#pragma omp for делегирует только части цикла для различные темы в текущей команде . Команда - это группа потоков выполнение программы. При запуске программы команда состоит только из отдельный элемент: главный поток , который запускает программу.

Чтобы создать новую команду потоков, нужно указать параллель ключевое слово. Это может быть указано в окружающем контексте:

#pragma omp parallel
{
   #pragma omp for
   for(int n = 0; n < 10; ++n)
   printf(" %d", n);
}

и

Что такое: параллельно, для и команды

Разница между параллелью, параллель для и для выглядит следующим образом:

Команда - группа тем которые исполняются в настоящее время. В начале программы команда состоит из одна нить. Параллельная конструкция разбивает текущий поток на новая команда потоков на время следующего блока / оператора, после чего команда сливается обратно в одну. для делит работу из цикл for среди потоков текущей команды.

не создает потоки, это только делит работу между потоками в настоящее время исполняющая команда. «Параллельно для» - это сокращение для двух команд одновременно: параллельно и для. Параллель создает новую команду, а для сплитов это Команда для обработки различных частей цикла. Если ваша программа никогда содержит параллельную конструкцию, никогда не бывает более одного потока; главный поток, который запускает программу и запускает ее, как в программы без многопоточности.

https://bisqwit.iki.fi/story/howto/openmp/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...