【问题标题】:Hybrid loop parallelization with MPI_THREAD_MULTIPLE使用 MPI_THREAD_MULTIPLE 的混合循环并行化
【发布时间】:2017-05-03 08:11:05
【问题描述】:

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

【问题讨论】:

    标签: c mpi openmp hpc


    【解决方案1】:

    您正在对来自所有线程的所有请求...调用MPI_Waitall。甚至还没有打开的请求——或者已经被其他线程完成的请求。确保每个请求只等待一次,在您启动非阻塞通信的线程中。

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

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

    【讨论】:

    • @_Zulan 只是创建一个线程私有的MPI_Request 数组似乎可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    相关资源
    最近更新 更多