cuda中共享和托管内存中的变量

Variable in the shared and managed memory in cuda

有了 CUDA 中现在的统一内存功能,变量可以在 managed 内存中,这使代码更简单一些。而 shared 内存在线程块中的线程之间共享。请参阅 CUDA Fortran.

中的第 3.2 节

我的问题是一个变量可以同时在 sharedmanaged 内存中吗?它们在主机中会是 managed 但在设备上,它们会是 shared 这种类型的变量可能会出现什么类型的行为?

我正在使用 CUDA Fortran。我问这个问题是因为,将变量声明为 managed 使我更容易编码,而在设备中将其声明为 shared 使其比全局设备内存更快。

我在文档中找不到任何能给我明确答案的内容。

My question is can a variable be in both the shared and managed memory?

不,这不可能。

托管内存 created 具有静态分配器(CUDA C 中的 __managed__ 或 CUDA fortran 中的 managed 属性)或动态分配器(cudaMallocManaged CUDA C,或 CUDA fortran 中的 managed(可分配)属性)。

这两个都与CUDA中的逻辑全局内存space相关联。 __shared__(或shared)内存space是一个单独的逻辑space,必须显式使用(分配、访问),独立于任何全局 space 用法。