Я пытаюсь распараллелить классический MPI_Issend
MPI_Irecv
для обмена гало с использованием потоков OpenMP и MPI_THREAD_MULTIPLE. Это означает, что каждый поток будет отправлять раздел главного буфера вправо и влево, и каждый поток отвечает за получение раздела буфера справа и слева.Распараллеливание гибридных циклов с помощью MPI_THREAD_MULTIPLE
#pragma omp parallel private(i,tid)
{
tid = omp_get_thread_num();
nthreads = omp_get_num_threads();
// starting position for each thread
int sizeid = SIZE/nthreads;
int startid = sizeid*tid;
int tstep;
for (tstep = 0; tstep < 5; tstep++){
MPI_Irecv(&recvright[startid], sizeid, MPI_INT, right, tid+101, comm, request + tid);
MPI_Irecv(&recvleft[startid], sizeid, MPI_INT, left, tid+201, comm, request + nthreads + 1 + tid);
MPI_Issend(&sendleft[startid], sizeid, MPI_INT, left, tid+101, comm, request + nthreads + 2 + tid);
MPI_Issend(&sendright[startid], sizeid, MPI_INT, right, tid+201, comm, request + nthreads + 3 + tid);
MPI_Waitall(4*nthreads, request, status);
}
}
Однако я получаю ошибки на MPI_Waitall
. Кто-нибудь знает, почему? Что я делаю не так?
@_Zulan Просто создать threadprivate 'MPI_Request' массив, кажется, решить эту проблему. – Manolete