如果我理解正确,我可以在分配CL缓冲区时使用CL_MEM_USE_HOST_PTR,以便从设备内核执行访问主机内存。我可以使用CL_MEM_COPY_HOST_PTR将数据复制到设备内存。我的问题是:我可以以某种方式分配一个阵列A,其中一半分配在主机内存中,另一半分配在设备内存中。假设前半部分分配在主机内存中。 A [0~(N / 2-1)]访问主机存储器,A [N / 2~(N-1)]访问设备存储器。
答案 0 :(得分:0)
真实的事实是你无法知道记忆在哪里。
分配的对象内存位于OpenCL“上下文”内,它纯粹是虚拟的,可以在任何地方(设备或主机)。 如果希望从指针获取内存,或从指针复制内存或在主机中分配副本,则只能指定OpenCL。但是,这些都不能保证主机端的内存一致性。也就是说,主机上的内存可能不是该内存对象的最后一个版本。由于OpenCL允许将内存缓存在设备中。
一些供应商指定在其实现和SDK中使用一些标志来在不同类型的内存之间进行选择(即:固定)。但这是依赖于实现的,并且不会改变您仍然需要使用clReadBuffer()或clMapBuffer()来确保主机端的值是内核的实际输出的事实。
根据我的个人经验,如果您不使用繁重的I / O.您只需使用CL_MEM_READ_WRITE标志即可。