写CUDA到底难在哪？
cuda目前主要事利用GPU的特性进行加速，使用cuda进行加速有几个重要点需要考虑： 1、并行思想。 如果一个算法无法通过并行加速，那么可以考虑放弃用cuda实现，因为这样cuda实现没有太大的效益。（当然还有一种想法就是解放cpu，而不在乎性能）。并行思想也是gpu编程的基础 2、独立显卡的数据传输耗时 对于独显还要考虑如何减少host端（cpu）的内存到device端（gpu）的内存传输耗时（独立显卡由自己的显存，一般通过pcie来传输cpu和gpu，数据量大时候耗时明显） 3、算法特性与架构特性 区分是计算密集型还是IO密集型算法，IO密集型的算法：要考虑GPU的缓存/共享内存如何使用来达到减少带宽传输耗时；还要考虑内存的合并访问问题，内存合并访问几乎是现阶段所有GPU编程中非常重要而基础的一个技术细节等。计算密集型算法：要考虑如何减少指令数量等。 4、精度与性能 有些算法可以通过牺牲精度来提升性能。例如有些GPU的float16性能往往能翻倍，可以尝试用低精度的数据类型看看能否满足需要，cuda一样有这样的情况 5、使用fast-math编译选项 cuda内部有实现一些快速函数，可以尝试开启fast-math编译选项，或许有很明显的提升 6、使用release版本进行性能测试 cuda代码尽可能用release版本，对于在windows开发的同学应该深有感触，debug和relWithDebinfo的版本性能下降达到1个数量级 7、必备cuda相关开发工具 工欲善其事，必先利其器。cuda开发有比较完整的调试和优化工具能大大提高开发和调优效率，例如最新的有nsight compute，cuda debugger，nsight system。