10.1 设置本章的原因

我们写OpenCL程序时,不仅限于编写高性能的内核代码,还要注意其他的一些因素,从而达到加速应用的效果。上一章我们介绍了如何使用目标机器的硬件特性,去优化OpenCL内核代码。一个OpenCL应用可以包含多个内核,以及一系列内存对象(可在主机端和设备端对数据进行搬移)。所以,我们需要对性能进行测试,并且去了解应用的瓶颈。对应用的性能分析有助于我们提高应用的性能,在对性能进行分析时,需要注意一下几点:

  • 当程序中有多个内核时,哪些内核需要去优化?
  • 内核在命令队列中等待的时间与实际运行的时间
  • 了解执行、初始化,以及内核编译在整个应用执行中的时间占比
  • 主机与设备之间的数据I/O在整个应用执行中的时间占比

弄清楚上面的问题和关系,可以帮助开发者判断该应用是否具有优化的空间。本章我们需要结合调试工具,明确这些信息。

所以,本章我们决定来聊一聊对于OpenCL内核代码的调试。调试并行程序要比调试串行程序复杂很多,因为在并行带程序中存在一些诸如条件竞争这样的非逻辑错误,所以有时候多线程的问题我们是很难发现和复现。