Opencl 想要只读缓冲区,只将数据从主机复制到设备

Opencl 想要只读缓冲区,只将数据从主机复制到设备,opencl,Opencl,我正在使用CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR创建缓冲区 我只想以一种方式将内存从主机复制到设备 我正在使用clenqueuenmapbuffer获取主机指针,并使用clenqueuenmapbuffer 将数据复制到设备 当我调用clEnqueueMapBuffer时,是否会触发从设备到主机的内存拷贝?如果您使用CL\u MAP\u WRITE,则可能会导致设备到主机的内存拷贝。说明书上说: 当clenqueemap{Buffer | Image}命

我正在使用
CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR
创建缓冲区

我只想以一种方式将内存从主机复制到设备

我正在使用
clenqueuenmapbuffer
获取主机指针,并使用
clenqueuenmapbuffer
将数据复制到设备


当我调用
clEnqueueMapBuffer
时,是否会触发从设备到主机的内存拷贝?

如果您使用
CL\u MAP\u WRITE
,则可能会导致设备到主机的内存拷贝。说明书上说:

clenqueemap{Buffer | Image}
命令完成时,由
clenqueemap{Buffer | Image}
返回的指针保证包含映射区域中的最新位


如果您使用的是OpenCL 1.2,那么您可以使用
CL\u MAP\u WRITE\u INVALIDATE\u REGION
指示您打算从主机覆盖整个映射区域,这意味着运行时不需要将任何数据从设备复制到主机。

对于CL1.2,答案是明确的,但是对于CL1.2之前的版本,答案并不明确。规范没有定义映射
CL\u map\u WRITE
时会发生什么。作为一种个人体验,它强制执行
CL\u MAP\u WRITE\u INVALIDATE\u REGION
的CL1.2行为。所以,不,从设备到主机没有额外的拷贝。这就是为什么在CL1.2之前的版本中,允许使用标记
CL_MAP_WRITE | CL_MAP_READ
,但在CL1.2中,它们被禁止在一起。谢谢你,jprice和DarkZeros!是的,我使用的是1.2。在我看来,如果缓冲区是使用CL_MEM_READ_创建的,那么您永远不会希望设备承载副本,因为设备永远不会更改缓冲区中的数据。因此,主机应该已经有了数据。注意:我放弃了clEnqueueMap/Unmap而选择了clEnqueueWriteBuffer,因为它在我的平台(AMD HD7700)上要快得多@void\u ptr是对的;您可以同时使用
CL\u-MAP\u-WRITE | CL\u-MAP\u-READ
,但不能将
CL\u-MAP\u-WRITE\u-INVALIDATE
。规范语句“CL_MAP_READ或CL_MAP_WRITE和CL_MAP_WRITE_INVALIDATE_REGION是互斥的。”应在“或”部分周围加括号阅读。