У меня есть этот код OpenMP, который выполняет простое сокращение:
for(k = 0; k < m; k++)
{
#pragma omp parallel for private(i) reduction(+:mysum) schedule(static)
for (i = 0; i < m; i++)
{
mysum += a[i][k] * a[i][k];
}
}
Я хочу создать код, эквивалентный этому, но с использованием задач OpenMP.Вот что я пробовал, следуя этой статье:
for(k = 0; k < m; k++)
{
#pragma omp parallel reduction(+:mysum)
{
#pragma omp single
{
for (i = 0; i < m; i++)
{
#pragma omp task private(i) shared(k)
{
partialSum += a[i][k] * a[i][k];
}
}
}
#pragma omp taskwait
mysum += partialSum;
}
}
Переменная partialSum
объявлена как threadprivate
, и это также глобальная переменная:
int partialSum = 0;
#pragma omp threadprivate(partialSum)
a
- это простой массив целых чисел (mxm).
Проблема в том, что когда я запускаю приведенный выше код (тот, что с задачами) несколько раз, я получаю разные результаты.
У вас есть представление о том, что я должен изменить, чтобы сделать эту работу?
С уважением