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

时间:2013-11-19 14:25:44

标签: cuda gpgpu nvidia virtual-address-space

现在,如果我使用此代码尝试在GeForce GTX460SE(CC2.1)中使用CUDA5.5从CPU核心访问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;
}

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

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

1 个答案:

答案 0 :(得分:8)

是的,CUDA 6中的新unified memory功能将使其成为可能,在Kepler设备上以及(因此不在您的Fermi GPU上)以共享主机和设备代码之间的指针。

为了实现这一目标,您需要使用Kepler设备(如cc 3.0或3.5)和新的cudaMallocManaged API。当CUDA 6.0正式推出时,这将进一步记录,但与此同时,您可以在this blog阅读更多相关信息,其中包括示例。

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

请注意,统一内存(UM)与统一虚拟地址(UVA)不同,后者自CUDA 4.0以来一直可用,并且是documented