параллельный омп противomp параллельный для

StackOverflow https://stackoverflow.com/questions/1448318

  •  11-09-2019
  •  | 
  •  

Вопрос

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

[А]

#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 находятся здесь:

https://openmp.org/specifications/

Другие советы

Они эквивалентны.

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

Вот пример использования разделенных parallel и for здесь.Короче говоря, его можно использовать для динамического выделения массивов OpenMP thread-private перед выполнением for цикл в нескольких потоках.Невозможно выполнить ту же инициализацию в parallel for кейс.

UPD:В примере вопроса нет разницы между одной прагмой и двумя прагмами.Но на практике вы можете сделать поведение, ориентированное на поток, более ориентированным на отдельные директивы parallel и for.Какой-нибудь код, например:

#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 for делегирует только части цикла для разных потоков в текущая команда. Команда - это группа потоков выполняющих программу.На момент запуска программы команда состоит только из одиночный участник:главный поток это запускает программу.

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

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

и:

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top