CUDA C Best Practices Guide 阅读笔记(1) 并行计算方法论(APOD)
APOD指的是Assess, Parallelize, Optimize, Deploy
如图所示,APOD过程是一个循环的过程,每次只进行一部分,从A到P到O到D,然后再进行下一轮的APOD
Assess
对于一个项目,第一步要做的是接触(Assess)项目,得到项目代码中每部分的执行时间。有了这部分内容,开发者就可以找到并行优化的瓶颈所在,并开始尝试用GPU加速。
根据Amdahl's and Gustafson's laws,开发者可以确定并行优化的性能上界。
Parallelize
找到瓶颈所在并确定了优化的目标和期望,开发者就可以优化代码了。调用一些如cuBLAS, cuFFT, or Thrust 的 GPU-optimized library 可能会很有效。
另一方面,有些应用需要开发者重构代码,以此让可以被并行优化得部分被暴露出来。
Optimize
确定了需要被并行优化的部分之后,就要考虑具体得实现方式了。
具体得实现方式通常不过只有一种,所以充分理解应用的需求是很有必要的。
要记得,APOD是一个反复迭代的过程(找到可以优化的点,实现并测试优化,验证优化效果,然后再重复)
因为对于开发者来说,没有必要最初就找到解决所有性能瓶颈的策略。
优化可以在不同的level上进行,配合性能分析工具是很有帮助的。
Deploy
大的原则是当优化完一处之后,立刻将这一部分部署到生产环境,而不是再去寻找其他可以优化的地方。
这样做有很多重要的原因,比如这会使得用户尽早从这个优化中收益(尽管提速只是部分的,但是仍然有价值)
此外,每次有改动就重新部署,也使得变化是平稳而不是激进的,这有助于减少风险。
Recommendations and Best Practice
优化根据对性能影响程度的不同有不同的优先级。
在先要处理低优先级的优化之前,一定要确保其他所有的高优先级优化都做完了。
这种方法将倾向于为所投入的时间提供最佳结果,并且将避免过早优化的陷阱。
需要说明的一点是,教程中的代码为了方便简洁没有关于任何 check error的部分。
在实际上这是不可取的(这不同于编写C++代码!)