使用MPI_THREAD_MULTIPLE进行混合循环并行化

时间:2016-12-17 20:45:26

标签: c mpi openmp hpc

我正在尝试将经典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收到错误。有谁知道为什么?我做错了什么?

1 个答案:

答案 0 :(得分:1)

您正在对来自所有线程的所有请求调用MPI_Waitall。甚至是尚未打开的请求 - 或者已经由其他线程完成的请求。确保只在每个请求中等待一次,在您开始非阻塞通信的线程中就是这种情况。

顺便说一句。您的请求索引也是错误的(重叠)。而不是request + nthreads + 2 + tid您可能需要request + nthreads * 2 + tid。然而,简单地创建一个线程本地MPI_Request[4]数组并等待它,并修复最初的问题会更清晰,更好。

另见https://stackoverflow.com/a/17591795/620382