特定共享内存写操作(MPI)的同步

Synchronization of particular shared memory write operations (MPI)

本文关键字:MPI 同步 操作 共享 内存      更新时间:2023-10-16

要使事情变得简单,并且要专注于我的问题的核心,让我们假设一个由指针变量ptr本地解决的内存位置在几个过程之间共享。我特别使用MPI在C/ 中共享内存窗口来分配和共享内存。要具体,假设ptr引用了浮点变量,所以我们本地有

float* ptr;

现在假设所有过程都尝试将相同的值 const float f写入PTR,即。

*ptr = f;

我的问题是:鉴于所有进程都试图以相同的方式修改字节,即鉴于f在每个过程中具有相同的值,因此此操作是否需要同步,或者可以同时执行。因此,我的问题归结为:为了同时进行写操作,例如浮点变量,尽管每个过程都试图以相同的方式修改内存,但种族条件是否会导致不一致的字节模式。IE。如果我确定每个过程都会写相同的数据,那么我可以省略同步吗?

是的,您必须同步共享内存。修改线程位于不同过程中的事实没有意义,它仍然是数据竞赛(从不同线程写入共享内存(。

请注意,同步对象解决的其他问题,例如可见性和内存重新排序,写入共享内存的内容是无关的。

当前,该标准并未定义过程的想法(仅线程(,并且不提供任何轻松在过程之间同步的方法。

您在共享内存中分配std::mutex,并在同步原始时使用它,或依靠Win32跨过程中的同步原始元素(如静音,semaphore或event(。

另外,如果您只想同步原始性,则可以在共享内存上分配std::atomic<T>并将其用作同步原始性。

在C 中,如果多个过程在不正确使用同步原始词或原子操作的情况下写入相同的存储位置,则会发生不确定的行为。(也就是说,它可能起作用,可能行不通,计算机可能会着火。(

实际上,在您的计算机上,基本上可以肯定地按照您认为应该工作的方式工作。实际上,在某些体系结构上,事物不会像您期望的方式一样:如果CPU无法读取/编写与您共享值一样小的内存块,或者共享值的存储越过对齐边界,这样的文字实际上也可能涉及阅读,并且读取模式写入可以带来将其他更改恢复或破坏记忆的影响。

获得想要的东西的最简单方法就是将写作作为"放松"的原子操作:

std::atomic_store_explicit(ptr, f, std::memory_order_relaxed);

在不引起数据竞赛的意义上,可以确保文字是"原子",并且不会在 *ptr = f可能存在潜在问题的体系结构上遇到任何开销。