В C++ с OpenMP, есть ли разница междупрагма OMP параллели против прагма OMP параллельно
#pragma omp parallel for
for(int i=0; i<N; i++) {
...
}
и
#pragma omp parallel
for(int i=0; i<N; i++) {
...
}
?
Спасибо!
В C++ с OpenMP, есть ли разница междупрагма OMP параллели против прагма OMP параллельно
#pragma omp parallel for
for(int i=0; i<N; i++) {
...
}
и
#pragma omp parallel
for(int i=0; i<N; i++) {
...
}
?
Спасибо!
#pragma omp parallel
for(int i=0; i<N; i++) {
...
}
Этот код создает параллельную область, и каждый отдельный поток выполняет то, что находится в вашем цикле. Другими словами, вы выполняете полный цикл N раз, вместо N потоков, разделяющих цикл и завершающих все итерации только один раз.
Вы можете сделать:
#pragma omp parallel
{
#pragma omp for
for(int i=0; i < N; ++i)
{
}
#pragma omp for
for(int i=0; i < N; ++i)
{
}
}
Это создаст один параллельный регион (ака одна вилка/присоединиться, что дорого, и поэтому вы не хотите сделать это для каждого цикла) и запустить несколько циклов в параллельно в этом регионе. Просто убедитесь, что у вас уже есть параллельный регион, который вы используете #pragma omp for
, а не #pragma omp parrallel for
, поскольку последний будет означать, что каждый из ваших N потоков порождает N больше потоков для выполнения цикла.
Я вижу; вот что мне нужно. Таким образом, первый вариант ('#pragma omp parallel') выполнил бы итерации Nthreads * N в целом, и любая инструкция формы' vec [i] = result; 'внутри цикла все испортила бы. –
@ FranciscoJ.R.Ruiz это правильно. Если этот ответ на ваш вопрос, не стесняйтесь отмечать его как ответ :) – RyanP
Конечно! Большое спасибо. –
Второй случай имеет каждый поток для одной и той же работы (весь цикл цикла). Первый случай делится работой между потоками, поэтому каждый поток выполняет итерации 'N/t', где' t' - количество потоков. –