2016-06-28 5 views
7

В 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++) { 
    ... 
} 

?

Спасибо!

+1

Второй случай имеет каждый поток для одной и той же работы (весь цикл цикла). Первый случай делится работой между потоками, поэтому каждый поток выполняет итерации 'N/t', где' t' - количество потоков. –

ответ

5
#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 больше потоков для выполнения цикла.

+0

Я вижу; вот что мне нужно. Таким образом, первый вариант ('#pragma omp parallel') выполнил бы итерации Nthreads * N в целом, и любая инструкция формы' vec [i] = result; 'внутри цикла все испортила бы. –

+0

@ FranciscoJ.R.Ruiz это правильно. Если этот ответ на ваш вопрос, не стесняйтесь отмечать его как ответ :) – RyanP

+0

Конечно! Большое спасибо. –