是否可以通过新CUDA6中的简单指针从CPU-Cores访问GPU-RAM?

Ale*_*lex 1 cuda gpgpu nvidia virtual-address-space

现在,如果我使用此代码尝试在GeForce GTX460SE(CC2.1)中使用CUDA5.5从CPU-Cores访问GPU-RAM,那么我会收到异常"访问冲突":

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <iostream>

int main()
{
    unsigned char* gpu_ptr = NULL;
    cudaMalloc((void **)&gpu_ptr, 1024*1024);

    *gpu_ptr = 1;

    int q; std::cin >> q;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但我们知道,有UVA(统一虚拟寻址).还有一些新的:

是否可以通过使用新CUDA6中的简单指针从CPU-Cores访问内存GPU-RAM?

Rob*_*lla 8

是的,unified memoryCUDA 6中的新功能将使Kepler设备及其他设备(以及您的Fermi GPU上没有)能够共享主机和设备代码之间的指针.

为了实现这一目标,您需要使用Kepler设备(如cc 3.0或3.5)和新cudaMallocManagedAPI.当CUDA 6.0正式发布时,这将进一步记录,但与此同时,您可以在此博客上阅读更多相关信息,其中包括示例.

这种机制不会神奇地导致PCI Express总线的影响消失,因此实际上发生的事情是两个数据副本正在"幕后"制作,并且cudaMemcpy操作由cuda运行时根据需要自动调度.有许多其他实现问题需要注意,现在我建议阅读博客.

请注意,统一内存(UM)与统一虚拟寻址(UVA)不同,后者自CUDA 4.0开始提供并已记录.