параллельный омп противomp параллельный для
-
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 находятся здесь:
Другие советы
Они эквивалентны.
#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 создает новую команду и для разбиений, которые объединяются для обработки разных частей цикла.Если ваша программа никогда не содержит параллельную конструкцию, никогда не существует более одного потока;главный поток, который запускает программу и выполняет ее, как в непоточные программы.