文章目录
- 前言
- 4.1 Android上进行OpenCL应用程序开发
- 4.2 Adreno OpenCL SDK 和 Adreno OpenCL 机器学习 SDK
- 4.3 调试工具和技巧
前言
本章主要介绍如何 debug Adreno OpenCL应用程序
4.1 Android上进行OpenCL应用程序开发
Adreno GPU 主要在 Android 操作系统和部分 Linux 系统上支持 OpenCL。要开发在 Android 上运行的支持 OpenCL 的应用程序,开发者需要使用 Android 软件开发工具包(SDK)和 Android 原生开发工具包(NDK)。有关 Android SDK 和 NDK,请参阅分别位于 SDK 和 NDK。
在本章和后续章节中,假设开发是在 Android 平台上进行的,并且开发者具有 Android SDK 和 NDK 的经验。在 Linux 上进行应用程序开发应该类似。
在 Snapdragon 平台上进行 OpenCL 开发有一些先决条件:
- 支持 OpenCL 的 Snapdragon 设备。并非所有 Snapdragon 设备都支持 OpenCL,请参阅表 3-1 获取更多详细信息。
- OpenCL 软件。Adreno GPU 上的 OpenCL 依赖于 QTI 专有库。
- 检查设备是否安装了 OpenCL 库。
- 核心库是 libOpenCL.so,通常位于设备上的 /vendor/lib 目录中。
- 一些供应商可能选择不包含 OpenCL 软件(例如,Google 的 Nexus 和 Pixel 设备)。
- 检查设备是否安装了 OpenCL 库。
- OpenCL 必须在 NDK 层运行。
- 对于开发和测试,不需要 root 访问权限,但在运行 SoCs 时可能需要进入性能模式。
4.2 Adreno OpenCL SDK 和 Adreno OpenCL 机器学习 SDK
开发者可以在 https://developer.qualcomm.com/software/adreno-gpu-sdk/tools 找到最新的 Adreno OpenCL SDK 和 Adreno OpenCL 机器学习 SDK。OpenCL SDK 提供了代码示例和文档,帮助开发者理解并有效地使用最新的 Adreno OpenCL 功能。通过一组专有的 API 函数和手动优化的内核,机器学习 SDK 帮助开发者在 Adreno GPU 上进行机器学习推理和训练应用程序的开发。
4.3 调试工具和技巧
由于 GPU 执行的并行性质,调试 OpenCL 应用程序通常是具有挑战性的。对于内核调试,OpenCL 支持 printf 函数,它类似于 c99 中的标准 printf,但有一些细微的差异。建议通过仅打印必要的变量(使用条件来限制输出)来减轻工作负担,因为printf通常会减慢代码执行速度。例如,可以仅启用有问题的工作组,甚至是单个有问题的工作项(通过在函数 CLEnqueueNDRangeKernel 中设置适当的偏移量)。
了解设备的软件版本是很重要的,因为在较新的版本中可能已经修复了一些错误或问题。要查询软件(驱动程序)和编译器版本,开发者可以使用 API 函数,如 clGetDeviceInfo 或 clGetPlatformInfo。
Adreno GPUs调试技巧
- 在内核中使用 barrier 或 fence 来防止编译器在其前后重新排序代码。
- 如果返回错误代码,请查阅 OpenCL 规范获取更多信息。
- 通过调试单个工作项/像素/工作组/内核来隔离问题。
- 例如,将 global_work_size 设置为 [1],并将 global_offset 设置为像素坐标 [x]。
- 如果在 API 函数/内核中观察到崩溃,以下是一些要检查的事项:
- 无效的内存地址。
- 其他 API 函数存在问题。
- 内存没有按预期更新。
- 存在溢出或内存缓冲区大小不正确。
- 尝试单一像素
- 内核执行尚未完成。
- 使用 clFinish / clWaitforEvent 确保内核执行完成。
- 结果是否不正确且不稳定。
- 不同的工作项是否写入相同的内存地址,是否存在缺失的同步或屏障。