如何确定缓冲区是在GPU上还是在CPU上?

如何确定缓冲区是在GPU上还是在CPU上?,c,memory,cuda,gpu,nvidia,C,Memory,Cuda,Gpu,Nvidia,在C/CUDA中,如果向我传递了一个指针,我如何通过编程确定指针是指向CPU上的内存还是指向GPU上的内存?是否有CUDA函数用于此目的?我不知道CUDA 4.0是如何使用的,但在3.2中,您无法仅根据存储在其中的地址推断它是CPU还是GPU指针 一种解决方法是创建一个类CudaPtr,在那里隐藏一个指针,并提供基本功能(例如memset,memload,memstore,memalloc等,它们反过来会使用CUDA的东西) 然后,如果您有一个可以在主机或设备上运行的函数,您可以轻松地为T*和C

在C/CUDA中,如果向我传递了一个指针,我如何通过编程确定指针是指向CPU上的内存还是指向GPU上的内存?是否有CUDA函数用于此目的?

我不知道CUDA 4.0是如何使用的,但在3.2中,您无法仅根据存储在其中的地址推断它是CPU还是GPU指针

一种解决方法是创建一个类
CudaPtr
,在那里隐藏一个指针,并提供基本功能(例如
memset
memload
memstore
memalloc
等,它们反过来会使用CUDA的东西)

然后,如果您有一个可以在主机或设备上运行的函数,您可以轻松地为
T*
CudaPtr
重载它



更新:自从统一内存寻址和新的CUDA工具包以来,情况发生了一些变化。现在,您似乎可以通过

在运行时进行这样的区分,为什么需要这些信息?“如果我被传递了一个指针”您的意思是如果您将指针传递到GPU?@scatman我认为他的意思是他试图将
cudamaloc
cudamalochost
的结果传递到同一个函数中,然后计算出哪个是哪个。我认为你最好先把它们分开。一些数据可能会在CPU或GPU上生成,然后传递给我正在编写的函数。我可以有两个函数,每种情况一个,但我宁愿只有一个函数,如果GPU还没有数据,就把数据复制到GPU上。有什么原因不能推断内存的位置吗?例如,即使在理论上,设备/GPU内存地址空间是否可以与主机/CPU内存地址空间重叠(即具有相同的地址)?或者仅仅是这样一个函数目前不可用?您是否尝试过查看应用程序中的值?我猜设备指针在它们自己的内存空间中,可能是基于0的,所以你会有0-256MB,而如果你的应用程序像传统的那样以0x400000的速度加载到Windows内存中,那么你的代码也会有这个范围内的指针。但它们指的是完全不同的记忆。或者,也许所有的设备指针都设置了它们的前两位,或者其他可以区分的东西?我现在没有CUDA硬件可供尝试。是的,GPU和CPU缓冲区的指针值往往非常不同,但我想要的解决方案对其他系统和平台来说是健壮的,而不是临时的。CUDA功能本来是很好的,但似乎没有。