将 __constant__ 内存与 MPI 和流一起使用
Using __constant__ memory with MPI and streams
如果我有一个 __constant__
值
__constant__ float constVal;
非阻塞流上的 MPI 等级可能会也可能不会初始化:
cudaMemcpyToSymbolAsync((void*)&constVal,deviceValue,sizeof(float),0,cudaMemcpyDeviceToDevice,stream);
这是:
- 在内核中同时被多个 MPI 等级访问是否安全? IE。等级是否共享
val
的相同实例,或者 MPI 语义(它们都有一个私有副本)是否仍然有效?
- 如果以上是安全的,那么通过多个 MPI ranks 初始化是否安全?
- 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 上下文和状态,那么它们不是。
- If the above is safe, is it safe to be initialized by multiple MPI ranks?
这不仅安全,而且是强制性的。
如果我有一个 __constant__
值
__constant__ float constVal;
非阻塞流上的 MPI 等级可能会也可能不会初始化:
cudaMemcpyToSymbolAsync((void*)&constVal,deviceValue,sizeof(float),0,cudaMemcpyDeviceToDevice,stream);
这是:
- 在内核中同时被多个 MPI 等级访问是否安全? IE。等级是否共享
val
的相同实例,或者 MPI 语义(它们都有一个私有副本)是否仍然有效? - 如果以上是安全的,那么通过多个 MPI ranks 初始化是否安全?
- 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 上下文和状态,那么它们不是。
- If the above is safe, is it safe to be initialized by multiple MPI ranks?
这不仅安全,而且是强制性的。