特定共享内存写操作(MPI)的同步
Synchronization of particular shared memory write operations (MPI)
要使事情变得简单,并且要专注于我的问题的核心,让我们假设一个由指针变量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
可能存在潜在问题的体系结构上遇到任何开销。
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- 松弛原子与无同步情况下的记忆连贯性
- MPI突然停止了对多个核心的操作
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 设置 Visual Studio for MPI: 找不到标识符错误
- 在C++中同步线程
- 与 stdio 同步是否使程序 I/O 非交互式?
- 如何在qt中同步应用程序和显示器的刷新率?
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- Windows 进程间同步类似事件?
- 重载 MPI 中的运算符 ()
- MPI:检查是否有任何进程已终止
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 将 10 个线程与原子布尔值同步
- 特定共享内存写操作(MPI)的同步
- 与MPI-2单向通信同步单个int值的问题
- 同步MPI-2单向通信中的顺序问题
- MPI2 / MPI3: MPI_allgather vs考虑同步的MPI单向通信
- MPI同步矩阵的向量