1

现在,如果我使用此代码尝试通过在 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 内核访问内存 GPU-RAM?

4

1 回答 1

8

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

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

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

请注意,统一内存 (UM) 与统一虚拟寻址 (UVA) 不同,后者自 CUDA 4.0 起就可用并已记录在案

于 2013-11-19T14:45:26.313 回答