Я хочу написать параллельный код с использованием 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 решает проблему.
На самом деле код совершенно неверен. Прежде всего, 'i' является общим, которого не должно быть. Должно существовать 'private (i)' предложение. Кроме того, есть две вложенные параллельные области. Что произойдет, так это то, что все потоки будут выполнять один и тот же код, и фактическое совместное использование не произойдет, так как вложенный параллелизм отключен по умолчанию, поэтому вложенные регионы будут выполняться последовательно. Не говоря уже о том, что результат, скорее всего, будет тарабарщиной, все потоки будут пытаться обновить общий SqSumLocal во внешней параллельной области. –
Большое спасибо @pburka и Hristo lliev за ваши предложения. фактически добавление int i в параллельной области решает проблему. – Manvi
@Manvi, переменные, объявленные внутри параллельной области, автоматически принадлежат классу private. –