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

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

为什么你需要这个信息? - fazo
如果我被传递一个指针,你的意思是如果你将指针传递给GPU? - scatman
@scatman 我认为他的意思是他正在尝试将cudaMalloccudaMallocHost的结果传递到同一个函数中,然后在之后确定哪个是哪个。我认为最好还是一开始就将它们分开处理。 - Rup
1
一些数据可能在CPU或GPU上生成,然后传递给我正在编写的函数。我可以为每种情况编写两个函数,但我宁愿只有一个函数,如果数据还没有在GPU上,则将其复制到GPU上。 - user664303
1个回答

4
我不知道CUDA 4.0是怎样的,但在3.2中,仅凭存储在其内部的地址,你无法确定它是CPU还是GPU指针。
解决方法是创建一个名为CudaPtr的类,将指针隐藏在其中并提供基本功能(例如memset、memload、memstore、memalloc等,这些基本功能将使用CUDA工具)。然后,如果你有一个可以在主机或设备上操作的函数,你可以轻松地重载它以支持T*和CudaPtr。
更新:由于统一内存寻址和新的CUDA工具包,事情发生了一些变化。现在似乎可以通过cuPointerGetAttribute在运行时进行这样的区分。

有没有理由不能推断内存的位置?例如,设备/GPU内存地址空间是否可以重叠(即具有与主机/CPU内存地址空间相同的地址),即使在理论上也是如此?还是说这样的功能目前只是不可用? - user664303
你有没有尝试查看应用程序中的值?我猜设备指针在它们自己的内存空间中,可能是基于0的,所以你可能会有0-256MB的空间,而如果你的应用程序像传统的那样加载到Windows内存中的0x400000,那么你的代码也会有指针在那个范围内。但是它们将引用完全不同的内存。或者,也许所有设备指针都设置了它们的前两位或其他什么东西,以便它们可以被区分?我现在没有CUDA硬件来尝试。 - Rup
是的,GPU和CPU缓冲区的指针值往往非常不同,但我需要一个对其他系统和平台具有鲁棒性的解决方案,而不是临时的解决方案。CUDA函数本来是个好选择,但似乎并没有这样的函数。 - user664303

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接