У меня есть итеративный алгоритм, который требует openmp и MPI для ускорения. Вот мой кодкак запустить многопроцессор в цикле While в openmp + mpi
#pragma omp parallel
while (allmax > E) /* The precision requirement */
{
lmax = 0.0;
for(i = 0; i < m; i ++)
{
if(rank * m + i < size)
{
sum = 0.0;
for(j = 0; j < size; j ++)
{
if (j != (rank * m + i)) sum = sum + a(i, j) * v(j);
}
/* computes the new elements */
v1(i) = (b(i) - sum)/a(i, rank * m + i);
#pragma omp critical
{
if (fabs(v1(i) - v(i)) > lmax)
lmax = fabs(v1(i) - v(rank * m + i));
}
}
}
/*Find the max element in the vector*/
MPI_Allreduce(&lmax, &allmax, 1, MPI_FLOAT, MPI_MAX, MPI_COMM_WORLD);
/*Gather all the elements of the vector from all nodes*/
MPI_Allgather(x1.data(), m, MPI_FLOAT, x.data(), m, MPI_FLOAT, MPI_COMM_WORLD);
#pragma omp critical
{
loop ++;
}
}
Но когда он не получил ускорение, даже не мог получить правильный ответ, то, что случилось с моим кодом? Поддерживает ли openmp цикл while? Спасибо!
По-видимому, вы просите каждый поток выполнить код и обновить общие переменные, что приведет к условиям гонки. Для параллелизма, как OpenMP, так и MPI, вы должны организовать, чтобы каждый поток работал на своем собственном наборе данных, получая производительность, решая сразу несколько независимых проблем. – tim18
@Alexander_Yau, вам нужно рассмотреть, что thread выполнит MPI_Allreduce & MPI_Allgather. Кроме того, предпочтительно использовать атомную операцию для обновления цикла. #pragma omp атомное обновление loop ++; – Angelos
@ Ангелос, 'MPI_Allreduce & MPI_Allgather' находится в состоянии гонки, не так ли? –