内存标志

分配内存时,你可以选择不同的模式:

  • 只读内存
  • 只写内存
  • 读/写内存

只读存储器分配在__constant 存储区中,而其他两个存储区分配在普通的__global 区域中。

除了可访问性之外,你还可以定义内存的分配位置。

  • 未指定:你的内存按照你的预期分配在设备内存中。 $ source 指针可以设置为 null。
  • CL_MEM_USE_HOST_PTR:这告诉设备数据在系统 RAM 中,不应该移动。相反,数据直接在 ram 中操作。
  • CL_MEM_COPY_HOST_PTR:告诉设备将给定地址的所有值复制到设备存储器,或者使用 CL_MEM_ALLOC_HOST_PTR 复制到系统 RAM 中的单独存储区域。
  • CL_MEM_ALLOC_HOST_PTR:告诉设备在系统 RAM 上分配空间。如果用作唯一参数,则$ source 指针可以设置为 null。

速度方面,访问设备全局内存是最快的。但是你还需要调用它两次才能复制数据。使用 Host-pointer 是最慢的,而 Alloc_host_ptr 提供更高的速度。

当使用 use_host_ptr 时,设备就是这样做的:它使用系统 ram 中的数据,当然这是由操作系统分页的。因此,每次内存调用都必须通过 cpu 来处理潜在的页面错误。当数据可用时,cpu 将其复制到固定存储器中,并使用宝贵的 CPU 时钟周期将其传递给 DMA 控制器。相反,alloc_host_ptr 在系统 ram 中分配固定内存。此内存位于 pageswap 机制之外,因此具有可保证的可用性。因此,设备可以在访问系统 RAM 时完全跳过 cpu,并利用 DMA 将数据快速复制到设备。