Параметр 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/