【问题标题】:What device is a cuda kernel running oncuda 内核在什么设备上运行
【发布时间】:2014-07-07 23:56:46
【问题描述】:

有没有办法从内核(GPU 代码)找出代码在哪个设备上运行?你可以找到blockIdx、threadIdx、blockDim和gridDim,但是有什么方法可以找到CUDA设备i​​d?

对于那些想知道的人,我计划在 OptiX 程序中使用它来更好地控制 OptiX 缓冲区。

【问题讨论】:

  • 您当然可以在主机上发现您需要的任何数据,然后在调用它时将其传递给内核。例如cudaSetDevice(x); mykernel<<<...>>>(x, ...);
  • 我受到 OptiX API 的限制,这使我无法控制如何将工作分配到多个 GPU 上。尽管如此,出于内存存储的原因,我还是想确定 RT_PROGRAM 在哪个设备上运行。因此,我需要在设备/内核端找到它,即。我需要一个带有 __ 设备 __ 标记的函数。
  • 您可以使用__device__ 变量来存储设备ID,因为这显然是每个设备...
  • 我不能,因为 NVIDIA OptiX 处理内核调用,我没有地方可以用正确的设备 ID 来 cudaMemset 这个变量。但我能做的是创建一个 OptiX 缓冲区并为每个设备手动设置其内容。这是一个相当不错的选择,但似乎没有更好的选择。

标签: cuda optix


【解决方案1】:

这在 OptiX 3.0 和 3.5 中有效,但我不能保证它会一直有效。我们应该在未来的版本中为此提供一个真正的 API。

namespace rti_internal_register
{
    __device__ unsigned reg_device_id;
}

rtBuffer<uchar4, 2> output_buffer;

RT_PROGRAM void pinhole_camera()
{
    if( rti_internal_register::reg_device_id == 0 )
        output_buffer[launch_index] = make_color( make_float3( 0.5, 0.0, 0.0 ) );
    else
        output_buffer[launch_index] = make_color( make_float3( 0.0, 0.5, 0.0 ) );
}

【讨论】:

    猜你喜欢
    • 2012-06-15
    • 2013-08-08
    • 2019-08-27
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多