他们可以将数据从主机传输到设备吗? 那么,有什么区别?一个人需要创建缓冲区吗?谢谢!
关于khronos网站的解释:
clEnqueueMapBuffer:
将一个命令排队,将缓冲区给定的缓冲区对象的区域映射到主机地址空间,并返回指向该映射区域的指针。
clEnqueueWriteBuffer
将命令排队以从主机内存写入缓冲区对象。
答案 0 :(得分:6)
编写缓冲区意味着你有2个内存对象 - 一个在主机上,由malloc等分配,一个在Device上,通过OpenCL API分配。
映射意味着您有一个由OpenCL API分配的对象,并且您正在将其地址转换为主机地址空间。
如果你的设备有来自RAM的内存,你最好使用映射 - 地址转换比复制花费更少的时间。
如果您的设备有单独的内存,您将看不到速度差异 - 数据将被隐式复制。
无论如何,映射可以让你摆脱内存重复。
答案 1 :(得分:4)
clEnqueueWriteBuffer:将数据从主机中的内存指针写入设备中的内存缓冲区。可能需要很短的时间才能完成,但在完成后不会有任何隐藏的事情。复制后,缓冲区将完全分离并独立。
clEnqueueMapBuffer:将主机指针映射到设备缓冲区,反之亦然(CL_MAP_READ / CL_MAP_WRITE)。这不会将任何内容复制到设备,但会声明您正在将其内容映射到另一个缓冲区。 例如,如果映射缓冲区进行写入,它将为您提供用于写入的映射指针。每次写入此映射缓冲区时,OpenCL API“可以”将其刷新到设备缓冲区。因此,它“可能”增加了对这些缓冲区的读/写速度。缺点是写入映射缓冲区后,您需要取消映射,以确保数据完全刷新到目标。
除非您迫切需要更多的I / O BW用于您的应用程序, 我不建议开始使用Map Buffers。简单的写入和读取 为新用户提供更简单,无错误的操作。