Adreno OpenCL Application Development(2)

一、基于Android的OpenCL应用程序开发

目前,Adreno GPU主要在Android操作系统(OS)和部分Linux系统上支持OpenCL。要开发一个使用OpenCL运行的Android应用程序,开发人员需要熟悉Android软件开发工具包(SDK)和本地开发工具包(NDK)。
在Snapdragon平台上开发OpenCL有几个先决条件:

1)并非所有的Snapdragon设备都支持OpenCL,详情可见上篇第一幅框图。
2) OpenCL软件。Adreno GPUs上的OpenCL依赖于QTI专有库。
3) 检查设备是否安装有OpenCL库,核心库是libopencl.so,它通常位于设备上的/vendor/lib。
4) 一些供应商可能选择不包括OpenCL的软件(例如谷歌的Nexus和Pixel设备)。
5) OpenCL必须在NDK层运行。
6) 开发和测试不需要根访问权限,但在性能模式下运行的片上系统可能需要访问权限。
以下为Adreno GPU开发OpenCL的需求:
在这里插入图片描述

二、Adreno OpenCL应用程序开发

由于GPU执行的并行性,调试OpenCL内核常常是一个挑战。Adreno GPU支持内核中的printf函数,这对于调试非常有用。要使用printf,建议减少工作负载,根据条件打印变量,避免打印出太多变量,因为printf会减慢代码执行速度。例如,只能启用有问题的工作组,甚至单个有问题的工作项(通过在函数CLEnqueeNDRangeKernel中设置适当的偏移量)
了解设备的软件版本很重要,因为某些错误或问题可能已在较新版本中修复。要查询软件(驱动程序)和编译器版本,可以使用名为clGetDeviceInfo的API函数。
给定一个应用程序,准确地分析其性能至关重要。两种常用的方法,CPU定时器和GPU定时器。

CPU Timer
CPU定时器用于测量主机端OpenCL调用的完整执行时间。这可以通过使用作为C/C++编程语言标准库的一部分的日期和时间函数来实现。一个例子是使用gettimeofday,如下所示:
#include <time.h>
#include <sys/time.h>
void main() {
struct timeval start, end;
gettimeofday(&start, NULL); /get the start time/
/Execute function of interest/ { . . .
clFinish(commandQ);
}
gettimeofday(&end, NULL); /get the end time/
/Print the total execution time/
printf("%ld\n", ((end.tv_sec * 1000000 + end.tv_usec)
- (start.tv_sec * 1000000 + start.tv_usec)));
}
OpenCL运行时排队API函数可以分为阻塞调用和非阻塞调用。对于非阻塞呼叫,必须小心使用CPU定时器:

  1. 非阻塞调用是指主机在提交一条指令后继续执行下一条指令(通常在另一个CPU线程中排队等待执行),而不是等待函数调用完成。
  2. 内核执行API函数,clEnqueueNDRangeKernel是一个非阻塞函数。
  3. 对于非阻塞调用,实际执行时间不是函数调用之间的时差。
    当使用CPU计时器从主机端测量内核执行时间时,必须使用clWaitforEvent调用(如果有非阻塞调用的事件ID)或clFinish来确保函数完成。同样的规则也适用于内存传输调用。

GPU Timer
所有OpenCL enqueue函数调用都有选择地向主机返回一个事件对象,OpenCL分析API可以使用该对象来查询执行时间。Adreno GPU有自己的时钟和计时器来测量功能执行流,GPU执行时间由独立于操作系统的GPU硬件计数器决定。
要启用GPU计时器功能,需要设置CL_QUEUE_PROFILING_ENABLE标志在当前命令队列的clCreateCommandQueue或clSetCommandQueueProperty的property参数中。此外,还必须为enqueue函数提供事件对象。函数完成后,应使用API函数clGetEventProfilingInfo获取命令执行的分析信息。
对于clEnqueeNDRangeKernel调用,使用clGetEventProfilingInfo函数和四个分析参数,包括CL_PROFILING_COMMAND_(QUEUED, SUBMIT, START,and END),可以在Adreno GPU中提供内核启动延迟和内核执行时间的准确图片。如下图所示:
在这里插入图片描述
三、总结

本篇文章介绍了Adreno OpenCL应用程序开发过程中的CPU和GPU定时器相关内容,大家对此部分内容感兴趣的话,非常欢迎前来相互探讨。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值