【问题标题】:CUDA pointers to device constantsCUDA 指向设备常量的指针
【发布时间】:2011-07-18 19:40:54
【问题描述】:

我在 CUDA 设备上定义了以下常量:

__constant__ int deviceTempVariable = 1;

现在我尝试使用两种方法获取deviceTempVariable 的地址,但我得到了不同的结果。第一种是来自 CUDA 内核的直接内存访问,如下所示:

__global__ void cudaPointers(pointerStruct* devicePointer)
{
    devicePointer->itsPointer = &deviceTempVariable;
}

另一种是通过主机代码如下:

cudaGetSymbolAddress((void**) &pointerCuda, "deviceTempVariable");

我很好奇并检查了地址值;第一个是00000008,第二个是00110008。偏移量似乎在所有情况下都相同(数字 8),但其余部分不同。这里发生了什么,我必须使用哪个地址?

【问题讨论】:

    标签: c++ memory pointers cuda


    【解决方案1】:

    在内核中创建的指针显然可以在设备上使用。它可能是一个物理地址,尽管一些 GPU 可能开始添加虚拟化(MMU 和 TLB)。

    看起来cudaGetSymbolAddress 正在为您提供一个可从主机处理器使用的地址。这是不同的,因为设备内存已经映射到主机的虚拟地址空间,并带有偏移量。

    主机代码应使用cudaGetSymbolAddress返回的地址,内核代码应使用地址运算符&

    嵌入在共享数据结构中的指针需要使用基于寻址(基本上与数组索引相同,您存储主机和内核都可以找到的已知位置的偏移量)。

    【讨论】:

      【解决方案2】:

      这很有趣。你如何打印这两个地址?你确定你没有打印指针的地址吗?

      你需要通过一个

      void * address;
      

      cudaGetSymbolAddress( &address, "deviceTempVariable");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-23
        • 1970-01-01
        • 1970-01-01
        • 2012-03-07
        • 2020-08-25
        • 2013-01-04
        • 1970-01-01
        • 2011-09-08
        相关资源
        最近更新 更多