【发布时间】:2014-07-07 23:56:46
【问题描述】:
有没有办法从内核(GPU 代码)找出代码在哪个设备上运行?你可以找到blockIdx、threadIdx、blockDim和gridDim,但是有什么方法可以找到CUDA设备id?
对于那些想知道的人,我计划在 OptiX 程序中使用它来更好地控制 OptiX 缓冲区。
【问题讨论】:
-
您当然可以在主机上发现您需要的任何数据,然后在调用它时将其传递给内核。例如
cudaSetDevice(x); mykernel<<<...>>>(x, ...); -
我受到 OptiX API 的限制,这使我无法控制如何将工作分配到多个 GPU 上。尽管如此,出于内存存储的原因,我还是想确定 RT_PROGRAM 在哪个设备上运行。因此,我需要在设备/内核端找到它,即。我需要一个带有 __ 设备 __ 标记的函数。
-
您可以使用
__device__变量来存储设备ID,因为这显然是每个设备... -
我不能,因为 NVIDIA OptiX 处理内核调用,我没有地方可以用正确的设备 ID 来 cudaMemset 这个变量。但我能做的是创建一个 OptiX 缓冲区并为每个设备手动设置其内容。这是一个相当不错的选择,但似乎没有更好的选择。