【问题标题】:How memory is mapped to gpu (opencl Intel graphics)内存如何映射到 gpu(opencl Intel 显卡)
【发布时间】:2019-06-26 11:21:23
【问题描述】:

我正在使用英特尔集成 gpu 来实现我的 opencl。我正在实现一个零副本的程序,我没有将数据复制到 gpu,而是共享公共内存 (RAM)。

我有一个 64 位 cpu,但在 gpu 规格中显示它只有 32 位寻址模式。

我在 gpu 和 cpu 之间共享一个 malloc 堆空间,当我打印地址时,我看到以下内容。

在 GPU 中:

if(id==0){
        printf("Mem address: %p\n",A); 

//Outputs Mem address: 0x1010000

在 CPU 中:打印

printf("Outside Mem address: %p\n",cpuA);
Device: Intel(R) HD Graphics IvyBridge M GT2
Outside Mem address: 0x7fcd529d9000

我不知道它是如何在 gpu 中映射的。我想知道 2^28/2^32 是否是 gpu 可以访问的最大地址?

【问题讨论】:

    标签: opencl


    【解决方案1】:

    您在主机上打印的内存地址是一个虚拟地址,它仅在您的程序进程的上下文中才有意义。在 CPU 中,this is transparently translated to a physical RAM page,其地址与虚拟地址无关,而是存储在操作系统维护的查找表(页表)中。请注意,“64 位 CPU”通常是指 虚拟 地址中的位数。 (尽管许多 64 位 CPU 实际上忽略了 8-16 位。)物理地址(用于寻址物理 RAM 单元和映射的设备内存)的位数通常要少得多,只有 40 位。

    连接到系统并能够执行直接内存访问 (DMA) 的设备最常处理 物理 内存地址。如果您的英特尔 GPU 没有内部内存映射方案(并且没有 IOMMU 处于活动状态,请参见下文),那么您在 OpenCL 内核代码中看到的地址可能是物理内存地址。如果设备只能寻址 32 位,这意味着它只能访问系统中 物理 内存的前 4GiB。通过将 4GiB 以上的内存分配给不受 32 位限制影响的设备和用户空间进程,或者通过使用“反弹缓冲区”,操作系统可以安排受限制设备使用的任何缓冲区位于该内存中区域,与虚拟地址无关。

    最近,IOMMU 变得很普遍。这些也为 devices 引入了类似映射系统的虚拟内存 - 因此设备看到的内存地址再次与它们对应的系统内存的物理地址无关。这主要是一项安全功能——理想情况下,每个设备都有自己的地址空间,因此设备不会意外或故意访问它们不应该访问的系统内存。这也意味着 32 位限制变得完全无关紧要,因为每个设备都有自己的 32 位地址空间,可以映射到 4GiB 边界之外的物理内存。

    【讨论】:

    • 我在 opencl 2.0 中遇到了共享虚拟内存功能,我现在正在使用。
    猜你喜欢
    • 2012-07-06
    • 2014-08-01
    • 2011-08-06
    • 2018-09-07
    • 1970-01-01
    • 2019-02-19
    • 2018-07-21
    • 2015-04-16
    • 1970-01-01
    相关资源
    最近更新 更多