clEnqueueMapBuffer和clEnqueueWriteBuffer有什么区别?

5
他们都可以将数据从主机传输到设备,对吗?那么有什么区别呢?一个需要创建缓冲区,另一个则不需要。谢谢!
khronos网站上的解释:
clEnqueueMapBuffer:
将一个由buffer指定的缓冲区对象的一部分映射到主机地址空间,并返回指向此映射区域的指针。
clEnqueueWriteBuffer:
将命令排队,从主机内存写入缓冲区对象。
2个回答

6
写入缓冲区意味着你有两个内存对象——一个在主机上,通过malloc等方式分配,另一个在设备上,通过OpenCL API分配。映射意味着你有一个对象,由OpenCL API分配,并将其地址转换为主机地址空间。如果设备有来自RAM的内存,则最好使用映射——地址转换比复制需要更少的时间。如果设备有单独的内存,则不会看到速度差异——数据将被隐式复制。无论如何,映射允许你摆脱内存重复。

如果使用CL_MEM_USE_HOST_PTR来分配初始缓冲区,那会怎样呢?这是否意味着只有一个内存对象? - Alex Rothberg
OpenCL标准规定,在使用CL_MEM_USE_HOST_PTR标志时,实现可以在设备端分配辅助缓冲区进行缓存。这对用户来说是透明的:http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clCreateBuffer.html - Roman Arzumanyan
同意。我猜根据英特尔的说法,你想尽力对齐内存页面:https://software.intel.com/sites/products/documentation/ioclsdk/2013/OG/Mapping_Memory_Objects_(USE_HOST_PTR).htm。 - Alex Rothberg

4

clEnqueueWriteBuffer:将主机内存指针中的数据写入设备内存缓冲区。它可能需要一小段时间才能完成,但完成后就不会有任何隐藏的东西。复制后,缓冲区将完全分离并独立。

clEnqueueMapBuffer:将主机指针映射到设备缓冲区或反之(CL_MAP_READ/CL_MAP_WRITE)。这不会将任何内容复制到设备,但说明您正在将其内容映射到另一个缓冲区。 例如,如果您映射一个用于写入的缓冲区,它将为您提供一个用于写入的映射指针。每次写入此映射缓冲区时,OpenCL API“可能”会将其刷新到设备缓冲区。因此,它“可能”会增加对这些缓冲区的读/写速度。缺点是,在写入映射缓冲区后,您需要取消映射,以确保数据完全刷新到目标位置。

除非您迫切需要更多的I/O BW来支持应用程序, 否则我不建议新手使用Map Buffers。普通的写入和读取操作更简单、更安全。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接