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