现在,如果我使用此代码尝试在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?
答案 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。