内存如何映射到gpu(opencl英特尔图形)

内存如何映射到gpu(opencl英特尔图形),opencl,Opencl,我使用英特尔集成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("Outs

我使用英特尔集成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可以访问的最大地址

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

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


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

我在opencl 2.0中遇到了共享虚拟内存功能,我现在正在使用相同的功能。