大家好,今天小白给大家简单分享下Hetcompute sdk中buffer相关的基础知识,欢迎一起交流学习。
一、基本buffer使用
1)HetCompute提供了一些buffer的API和实时管理的heterogeneous数据架构。使用HetCompute buffer的任务能够在CPU,GPU,DSP分享数据。一个HetCompute缓冲区是用户定义数据类型t的连续数组。每个缓冲区可以有一个或多个类型的缓冲区指针指向它:hetcompute::buffer_ptr or hetcompute::buffer_ptr。
2)缓冲区被引用计数:当没有更多的缓冲区指针指向它时,HetCompute运行时将自动释放缓冲区。
3)hetcompute::buffer_ptr允许对缓冲区数据进行可变访问,而hetcompute::buffer_ptr只允许不可变访问(类似于int对const对int实例的访问)。下面的代码说明了创建预期数量的元素缓冲区时最基本的API调用。
hetcompute::buffer_ptr b1 = hetcompute::create_buffer(100);
hetcompute::buffer_ptr b2 = hetcompute::create_buffer(100);
hetcompute::buffer_ptr b3 = hetcompute::create_buffer(100);
4)运行时可以显示的移动管理专用设备特定备份存储之间缓冲区数据。例如,运行时将ION内存分配为后备存储器,以便在CPU和DSP之间实现缓冲区数据的最佳共享。类似地,运行时使用opencl缓冲区作为后备存储器来同步CPU和GPU之间的缓冲区数据。此外,运行时试图利用任何可用的高级方式,了解哪些设备可以访问缓冲区,以优化从专用设备内存分配后备存储,并最小化后备存储之间的数据复制。
5)请参阅Textures,了解仅适合GPU图像数据的数据结构。有四个实体可以访问缓冲区的数据。
1)一个CPU任务。
2)一个GPU任务。
3)一个DSP任务。
4)CPU主机代码。
6)任务访问:任务可以通过将相应的缓冲区指针作为参数访问缓冲区。任务可以作为输入、输出或输入输出(称为访问方向)访问缓冲区。创建任务使用指定设备的内核:(hetcompute::cpu_kernel, hetcompute::gpu_kernel and hetcompute::dsp_kernel)。内核的签名可以显式声明每个缓冲区指针参数的方向,或者根据缓冲区指针的可变性隐式推断方向:(hetcompute::buffer_ptr versus hetcompute::buffer_ptr).
Note:可以使用lambda、functor或函数参数直接创建CPU任务,而不涉及CPU内核。对于这样的CPU任务,从缓冲区指针参数对lambda、functor或函数的可变性隐式推断出任何缓冲区指针参数的访问方向。
7)主机代码访问:CPU上的应用程序代码可以使用缓冲区指针直接访问缓冲区的数据。主机代码访问是指从应用程序代码进行的任何访问,这些应用程序代码不是包含在任务中,或者使用的缓冲区指针不是封闭任务的参数。
8)The following example illustrates the difference between task and host code access.
二、在任务中使用buffer
1)下面的示例说明由直接从用户函数创建的CPU任务访问缓冲区。注意,访问方向是根据相应缓冲区指针参数的可变性隐式推断出来的。
2)下面的示例说明了使用CPU内核创建的CPU任务对缓冲区的访问。
3)在上面的示例中,用户函数通过将缓冲区指针索引为数组来访问缓冲区数据。主机代码以类似的方式访问缓冲区数据。主机代码和CPU任务也可以请求一个指针来操作缓冲区的整个内容,如下所示。
4)下面的示例说明如何使用隐式推断的访问方向创建GPU任务,与上面的CPU任务示例类似。
5)通过使用hetcompute::in, hetcompute::out和hetcompute::inout包装内核的缓冲区指针模板参数,可以显式指定访问方向,如下所示。
Note: GPU内核可以使用OpenCL的C函数或OpenGL ES shader创建。但是,缓冲区以相同的方式与任何类型的GPU内核交互。
6)当从dsp函数创建hetcompute::dsp内核实例时,HetCompute识别来自IDL签名的传入和传出访问方向,如下例所示:
本篇主要简单介绍了Hetcompute sdk中buffer相关的基础知识,想了解更多使用详情,欢迎查看https://qualcomm.csdn.net/m/zone/qualcomm2016/project/8960