1.2 简单的任务并行示例
接下来的示例accTask.cpp演示如何在OpenACC设备上并行执行单个任务。
使用任务并行时必须小心,因为OpenACC设备可能有不利于发挥性能的性能约束。一般来说,最好所有的OpenACC线程在相同时刻执行相同的任务,这样并行任务可以很好地映射到GPU SIMD流多处理器和常见的多核处理器的向量单元。高级程序员希望使用OpenACC async()子句和流,这使他们能实现更复杂的任务并行。特别是,感兴趣的读者应该研究并行任务分解和依赖图。推荐阅读《并行计算导论》(Grama, Abshul, Karypis&Kumar, 2003),在网络上也有很多讨论和教程。
accTask.cpp如图1-9所示,假定内联方式声明task()函数,或将task函数与注记结合来告诉编译器这是OpenACC例程。
在主函数中唯一介绍的新概念是使用C++高精度时间类,用最小的滴答周期来报告时间以及task()函数时间。
图1-10提供了一个忙循环(busy-loop)的例子。
这个函数利用OpenACC routine指令。OpenACC 2.0引入了#pragma acc routine,用来指导编译器编译设备区域内调用的设备端函数或子程序。worker子句告诉编译器例程内的任何代码和task内调用的其他例程将会在一个工作项内执行。使用C++ inline关键字包含短的代码。