主机程序与硬件内核之间的交互依赖于创建缓冲器并在器件中的存储器上传入和传出数据。这一过程会利用诸如
clCreateBuffer
和 clEnqueueMigrateMemObjects
等函数。
重要: 单一缓冲器大小不能超过 4 GB,但为了最大限度提升从主机到全局存储器的吞吐量,赛灵思还建议尽可能保留大小至少为 2 MB 的缓冲器。
有两种方法可用于分配存储缓冲器和传输数据:
如由 XRT 分配缓冲器,请使用 enqueueMapBuffer
来捕获缓冲器句柄。在第二种情况下,使用 CL_MEM_USE_HOST_PTR
来直接分配缓冲器,因此您无需捕获缓冲器句柄。
有多种编码实践可供您用于最大程度提升性能和高精度控制。OpenCL API 还支持通过其它命令来读写缓冲器。例如,您可使用
clEnqueueWriteBuffer
和
clEnqueueReadBuffer
命令代替 clEnqueueMigrateMemObjects
。但其中部分命令具有不同的影响,使用时必须明确其作用。例如,
clEnqueueReadBufferRect
可以读取缓冲器对象的矩形区域并传输到主机应用,但它不会将数据从器件全局存储器传输到主机。您必须首先使用 clEnqueueReadBuffer
将数据从器件全局存储器传输到主机应用,然后使用 clEnqueueReadBufferRect
来读取目标矩形部分,并将其传输到主机应用中。