gpt4 book ai didi

c - 同步访问 MPI3 共享内存 : is this code guaranteed to work by MPI standards?

转载 作者:行者123 更新时间:2023-12-04 01:33:48 26 4
gpt4 key购买 nike

MPI-3 标准引入了共享内存,所有共享此内存的进程都可以读取和写入共享内存,而无需调用 MPI 库。
虽然有使用共享或非共享内存进行单方面通信的示例,但我没有找到太多关于如何通过直接访问正确使用共享内存的信息。

我最终做了这样的事情,效果很好,但我想知道 MPI 标准是否保证它总是有效?

// initialization:
MPI_Comm comm_shared;
MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, i_mpi, MPI_INFO_NULL, &comm_shared);

// allocation
const int N_WIN=10;
const int mem_size = 1000*1000;
double* mem[10];
MPI_Win win[N_WIN];
for (int i=0; i<N_WIN; i++) { // I need several buffers.
MPI_Win_allocate_shared( mem_size, sizeof(double), MPI_INFO_NULL, comm_shared, &mem[i], &win[i] );
MPI_Win_lock_all(0, win);
}

while(1) {
MPI_Barrier(comm_shared);
... // write anywhere on shared memory
MPI_Barrier(comm_shared);
... // read on shared memory written by other processes
}

// deallocation
for (int i=0; i<N_WIN; i++) {
MPI_Win_unlock_all(win[i]);
MPI_Win_free(&win[i]);
}

在这里,我通过使用 MPI_Barrier() 来确保同步并假设硬件使内存 View 保持一致。
此外,因为我有多个共享窗口,所以一次调用 MPI_Barrier 似乎比调用 MPI_Win_fence() 更有效。在每个共享内存窗口上。

它似乎在我的 x86 笔记本电脑和服务器上运行良好。
但是这个程序是一个有效/正确的 MPI 程序吗?
有没有更有效的方法来实现同样的目标?

最佳答案

这里有两个关键问题:

  • MPI_Barrier绝对不是内存障碍,永远不应该那样使用。在大多数情况下,它可能会同步内存作为其实现的副作用,但用户永远不能假设。 MPI_Barrier只保证同步进程执行。 (如果有帮助,您可以想象一个系统,其中 MPI_Barrier 是使用不超过 MPI 标准要求的硬件小部件实现的。IBM Blue Gene 在某些情况下就是这样做的。)
  • 如果没有关于您在此处使用共享内存实际执行的操作的详细信息,则此问题无法回答:
  • while(1) {
    MPI_Barrier(comm_shared);
    ... // write anywhere on shared memory
    MPI_Barrier(comm_shared);
    ... // read on shared memory written by other processes
    }

    它可能没有写清楚,但 MPI-3 标准相关文本的作者假设 - 我是这个组的成员 - 可以使用底层/宿主语言的内存模型来推理共享内存.因此,如果您在 C11 中编写此代码,则可以根据 C11 内存模型对其进行推理。

    如果你想使用 MPI 来同步共享内存,那么你应该使用 MPI_Win_sync在用于加载存储访问的所有窗口和 MPI_Win_flush 上用于 RMA 操作 ( Put/ Get/ Accumulate/ Get_accumulate/ Fetch_and_op/ Compare_and_swap )。

    我期待 MPI_Win_sync被实现为 CPU 内存屏障,因此为每个窗口调用它是多余的。这就是为什么假设 C11 或 C++11 内存模型并使用 https://en.cppreference.com/w/c/atomic/atomic_thread_fence 可能更有效的原因。和 https://en.cppreference.com/w/cpp/atomic/atomic_thread_fence , 分别。

    关于c - 同步访问 MPI3 共享内存 : is this code guaranteed to work by MPI standards?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60298288/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com