一、优化原则
- 最大化算术强度;
- 减少内存操作花费时间;
- 合并全局内存访问;
- 避免线程发散;
- 把高频使用数据移动到共享内存;
二、纵向
优化的流程与步骤一般包括如下步骤:
1.1 分析
分析程序的瓶颈、什么地方需要做并行、能够提供资源。不要依赖直觉,尽量借助工具:
- gProf
- VTune
- VerySleepy
1.2 并行
这个阶段考虑使用并行库(OpenMP是CPU上的并行,OpenACC)、指令、选择好算法等。
1.3 优化
测试程序的内存、带宽和占用率等指标是否达到硬件或者贴近硬件的极限。最重要的是,是否满足要求。
1.4 部署
在预算内考虑更加符合场景的硬件等设备。
三、横向
在考虑cpu与GPU还是所有不同。考虑CPU运行效率时一般只考虑时间效率,但是考虑GPU时,除了时间效率,还有能够并行的程度。如下面的GPU例子中的堆排序,堆排序对于CPU是一个较好的排序算法,但是对于GPU却不是,因为它并行程度很低。