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

Posted

技术标签:

【中文标题】如何确定缓冲区是在 GPU 上还是在 CPU 上?【英文标题】:How do I determine whether a buffer is on the GPU or the CPU? 【发布时间】:2011-07-17 09:00:31 【问题描述】:

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

【问题讨论】:

为什么需要这些信息? “如果我被传递了一个指针”你的意思是如果你将指针传递给 GPU? @scatman 我认为他的意思是他试图获取cudaMalloccudaMallocHost 的结果并将它们传递给同一个函数,然后找出哪个是哪个。我认为您最好一开始就将它们分开。 一些数据可能会在 CPU 或 GPU 上生成,然后传递给我正在编写的函数。我可以有两个函数,每种情况一个,但我宁愿只有一个函数可以将数据复制到 GPU,如果它还没有的话。 【参考方案1】:

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

一种解决方法是创建一个类CudaPtr<T>,在其中隐藏一个指针并提供基本功能(例如memsetmemloadmemstorememalloc 等,而这又将使用 CUDA东西)。

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


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

在运行时进行此类区分

【讨论】:

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

以上是关于如何确定缓冲区是在 GPU 上还是在 CPU 上?的主要内容,如果未能解决你的问题,请参考以下文章

我应该在 GPU 上还是在 CPU 上计算矩阵?

如何检查keras tensorflow后端是GPU还是CPU版本? [复制]

tensorflow如何设置只在cpu上运行

在linux下如何确定gpu是不是利用啊,怎么查看S胻op命令

在 openGL 中,模型坐标应该在我的 CPU 上还是通过 OpenGL 调用在 GPU 上计算?

添加自定义图层时训练非常慢。我发现这个张量运算在 cpu 上而不是在 gpu 上运行,我不知道为啥?