2014-11-14 1 views
0

Я хочу написать параллельный код с использованием openmp и сокращение для квадратного сложения значений матрицы (X * X). Могу ли я использовать «2 для циклов» после #pragma omp для уменьшения. если не любезно предложить.как распараллелить код с помощью openmp, чтобы добавить сумму матрицы с уменьшением

#pragma omp parallel 
{ 
#pragma omp parallel for reduction(+:SqSumLocal) 
for(index=0; index<X; index++) 
{ 
    for(i=0; i<X; i++) 
    { 
    SqSumLocal = SqSumLocal + pow(InputBuffer[index][i],2); 
    } 
} 
} 

Решение проблемы: добавление int i под #pragma omp parallel решает проблему.

ответ

1

То, как вы написали это правильно, но не идеально: только внешний цикл будет распараллелен, и каждая из внутренних циклов будет выполняться на отдельных потоках. Если X достаточно большой (значительно больше, чем количество потоков), это может быть хорошо. Если вы хотите распараллелить как петли, тогда вы должны добавить в директиву пункт collapse(2). Это говорит компилятору объединить два цикла в один цикл и выполнить все это параллельно.

Рассмотрим пример, в котором у вас есть 8 потоков, и X = 4. Без предложения collapse будут выполняться только четыре потока: каждый из них завершит работу для одного значения index. С предложением collapse все 8 потоков будут выполнять половину работы. (Разумеется, распараллеливание такого тривиального объема работы бессмысленно - это просто пример.)

+1

На самом деле код совершенно неверен. Прежде всего, 'i' является общим, которого не должно быть. Должно существовать 'private (i)' предложение. Кроме того, есть две вложенные параллельные области. Что произойдет, так это то, что все потоки будут выполнять один и тот же код, и фактическое совместное использование не произойдет, так как вложенный параллелизм отключен по умолчанию, поэтому вложенные регионы будут выполняться последовательно. Не говоря уже о том, что результат, скорее всего, будет тарабарщиной, все потоки будут пытаться обновить общий SqSumLocal во внешней параллельной области. –

+0

Большое спасибо @pburka и Hristo lliev за ваши предложения. фактически добавление int i в параллельной области решает проблему. – Manvi

+2

@Manvi, переменные, объявленные внутри параллельной области, автоматически принадлежат классу private. –

Смежные вопросы