将 __constant__ 内存与 MPI 和流一起使用

Using __constant__ memory with MPI and streams

如果我有一个 __constant__

__constant__ float constVal;

非阻塞流上的 MPI 等级可能会也可能不会初始化:

cudaMemcpyToSymbolAsync((void*)&constVal,deviceValue,sizeof(float),0,cudaMemcpyDeviceToDevice,stream);

这是:

  1. 在内核中同时被多个 MPI 等级访问是否安全? IE。等级是否共享 val 的相同实例,或者 MPI 语义(它们都有一个私有副本)是否仍然有效?
  2. 如果以上是安全的,那么通过多个 MPI ranks 初始化是否安全?
  1. Safe to be accessed by multiple MPI ranks simultaneously within kernels? I.e. do ranks share the same instance of val or do MPI semantics (they all have a private copy) still hold?

都没有。 CUDA 上下文不在进程之间共享。如果您有多个进程,您将获得多个上下文,并且每个上下文都有其自己的所有静态定义符号和代码的副本。此行为独立于 MPI 语义。如果您想象 MPI 通信器中的多个进程正在共享相同的 GPU 上下文和状态,那么它们不是。

  1. If the above is safe, is it safe to be initialized by multiple MPI ranks?

这不仅安全,而且是强制性的。