MPI_THREAD_MULTIPLE 的混合循环并行化
Hybrid loop parallelization with MPI_THREAD_MULTIPLE
我正在尝试并行化经典 MPI_Issend
MPI_Irecv
以使用 OpenMP 线程和 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
处遇到错误。有谁知道为什么?我做错了什么?
您正在针对所有请求...从所有线程调用 MPI_Waitall
。即使是尚未打开的请求 - 或者已经由其他线程完成。确保每个请求只等待一次,在您的情况下,您正在启动非阻塞通信的线程中。
顺便说一句。您的请求索引也是错误的(重叠)。而不是 request + nthreads + 2 + tid
你可能想要 request + nthreads * 2 + tid
。然而,简单地创建一个线程本地 MPI_Request[4]
数组并等待它,同时修复最初的问题会更干净、更好。
另见
我正在尝试并行化经典 MPI_Issend
MPI_Irecv
以使用 OpenMP 线程和 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
处遇到错误。有谁知道为什么?我做错了什么?
您正在针对所有请求...从所有线程调用 MPI_Waitall
。即使是尚未打开的请求 - 或者已经由其他线程完成。确保每个请求只等待一次,在您的情况下,您正在启动非阻塞通信的线程中。
顺便说一句。您的请求索引也是错误的(重叠)。而不是 request + nthreads + 2 + tid
你可能想要 request + nthreads * 2 + tid
。然而,简单地创建一个线程本地 MPI_Request[4]
数组并等待它,同时修复最初的问题会更干净、更好。
另见