c - MPI(异步)循环迭代

标签 c asynchronous mpi

我有一个类似于下面的程序。在下面的代码中,所有进程都知道所有其他进程的当前迭代步骤。但是,我很好奇是否有一种方法可以在没有集体调用(例如 MPI_PUT)的情况下执行此操作,特别是在每个进程以不同速率迭代的情况下

#include <errno.h>
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>


/* OUTPUT
 * $ mpirun -np 4 so00.exe
 * @[0]: p |       0       1       2       3
 * @[0]: p |       4       5       6       7
 * @[0]: p |       8       9       10      11
 * @[0]: p |       12      13      14      15
 * @[0]: p |       16      17      18      19
 * @[1]: p |       0       1       2       3
 * @[1]: p |       4       5       6       7
 * @[1]: p |       8       9       10      11
 * @[1]: p |       12      13      14      15
 * @[1]: p |       16      17      18      19
 * @[2]: p |       0       1       2       3
 * @[2]: p |       4       5       6       7
 * @[2]: p |       8       9       10      11
 * @[2]: p |       12      13      14      15
 * @[2]: p |       16      17      18      19
 * @[3]: p |       0       1       2       3
 * @[3]: p |       4       5       6       7
 * @[3]: p |       8       9       10      11
 * @[3]: p |       12      13      14      15
 * @[3]: p |       16      17      18      19
 */
int main(int argc, char *argv[])
{
    int i, n, rank, np;

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &np);

    ////////////////////////////////////////////////////////////////////////////

    int *pos;
    MPI_Win win;
    MPI_Alloc_mem(sizeof(int)*np, MPI_INFO_NULL, &pos);
    MPI_Win_create(pos, np, sizeof(int), MPI_INFO_NULL, MPI_COMM_WORLD, &win);

    for (i=rank; i<(np*5); i+=np)
    {
        MPI_Win_fence(MPI_MODE_NOPRECEDE, win);
        for (n = 0; n < np; n++)
        {
            MPI_Put(&i, 1, MPI_INT, n, rank, 1, MPI_INT, win);
        }
        MPI_Win_fence((MPI_MODE_NOSTORE | MPI_MODE_NOSUCCEED), win);
        printf("@[%d]: p | ", rank);
        for (n = 0; n < np; n++) printf("\t%d", pos[n]);
        printf("\n");
    }

    ////////////////////////////////////////////////////////////////////////////

    MPI_Win_free(&win);
    MPI_Free_mem(pos);

    MPI_Finalize();

    return EXIT_SUCCESS;
}

最佳答案

您不需要使用 MPI_Win_fence 来同步 MPI 中的 RMA 调用。还可以使用MPI_Lock(及其变体)来执行所谓的“被动目标”模式。此模式的同步性要低得多,因为它不需要“事件目标”模式所需的所有集体调用。

这里太复杂了,无法提供完整的答案,但您可以在网上找到许多有关该主题的论文以及文档。完整的 MPI-3 标准可用 here 。请参阅第 11 章了解单方面的沟通。

关于c - MPI(异步)循环迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6683180/

相关文章:

Java NIO 非阻塞模式 vs node.js 异步操作

javascript - 如何将变量设置到元素视频的事件中

c - 使用mpi.h,如何使用mpi.h的MPI_Altoallv为每个处理器发送超过4个整数?

python - 二进制文件转python整数列表

c - 如何限制用户输入字符串的大小或动态分配内存

scala - 在 scala.rx 中找不到 `eventually`

c++ - 在单个节点上,我是否应该选择 MPI 而不是其他进程间机制?

c - 为什么我的 MPI 程序输出不正确

c - 当我们进行结构类型转换时,到底发生了什么?

c - 如何禁用 fread() 中的缓冲?