openCL:直接从主机内存初始化本地内存缓冲区



我有很多情况下,我创建一个缓冲区输入数据从主机的内存(与CL_MEM_COPY_HOST_PTRCL_MEM_USE_HOST_PTR),并将其作为参数传递给我的内核,只是复制其内容到组的本地内存在内核的开始。
我想知道,如果有可能直接初始化本地内存缓冲区与主机的内存值,而不需要写入设备的全局内存(这是CL_MEM_COPY_HOST_PTR所做的,据我所知)也不是它的缓存(这是CL_MEM_USE_HOST_PTR所做的,AFAIU)。
当然,每个工作组都需要使用主机输入数据的不同偏移量初始化其本地缓冲区。

或者,是否有一种方法告诉CL_MEM_USE_HOST_PTR绝对不缓存值,因为每个值只会被读取一次?无论我将其与主机访问或读写标志相结合,以及我是否将内核的参数注释为__global,__constant__global const,性能总是比CL_MEM_COPY_HOST_PTR差几个%,这似乎表明内核试图大量缓存输入值,我猜。(我的猜测是CL_MEM_COPY_HOST_PTR写入整个连续内存区域,这比CL_MEM_USE_HOST_PTR在缓存正在读取的值时的ad-hoc写入要快)

根据OpenCL规范,主机不能访问本地内存。只有内核可以读写LDS。至于CL_MEM_USE_HOST_PTRCL_MEM_USE_HOST_PTR,后者给了你完全的控制权,而CL_MEM_USE_HOST_PTR可以在内核执行之前将整个缓冲区复制到设备上,也可以在内核内部为每个缓冲区读取操作进行PCI-e事务。

最新更新