CUDA C最佳实践指南--附录A

附录A  建议和最佳实践

 

本附录包含这个文档中已经解释的优化建议和最佳实践的汇总。

 

A.1 性能优化策略综述

 

性能优化围绕着如下三个基本侧罗展开:

  • 最大化并行执行
  • 优化内存使用以最大化内存带宽
  • 优化指令使用以最大化指令吞吐量

最大化并行执行首先要分析算法,获得尽可能多的数据并行。然后把这些并行性尽可能高效地映射至硬件,这可以通过仔细编写核函数来达到。在更高的层次上,应用也可以通过流技术在设备上或设备与主机之间以显式并发执行的方式最大化并行执行。

 

优化内存使用首先应该从最小化主机和设备间的数据传输开始,因为这种传输的带宽比内部设备之间的要低很多。然后通过最大化共享内存的使用来最小化核函数对全局内存的访问。有时,最佳的优化甚至是从一开始就通过重新计算需要的数据来避免任何的数据传输。

 

有效带宽严重依赖于每种内存的访问模式,随访存的顺序变化而变化。接下来要根据最佳访存模式组织内存访问以优化内存的使用。这种优化对于其访存延迟高达数百个时钟周期的全局内存的访问显得特别重要。相比而言,共享内存的访问值得优化的仅仅是避免大的bank冲突。

 

至于优化指令的使用,那些低吞吐量的算术指令应予避免。在不影响最终结果的前提下建议以精度换速度,比如使用指令代替正规函数或者用单精度代替双精度。最后,由于设备执行的SIMT(single instruction multiple thread,单指令多线程)的特性,对于控制流指令要特别地注意。

 

A.2 高优先级建议

  • 为了从CUDA中获得最大效益,首先把注意力放在发掘并行化串行代码的方式。(1.1.3节)
  • 当评估性能和优化效率的时候把计算的有效带宽做为度量的指标。(2.2节)
  • 最小化主机和设备间的数据传输,即使针对这些数据的函数在设备上运行并未显示出较在主机上运行的优势时亦如此。(3.1节)
  • 尽可能保证合并访问全局内存。(3.2.1节)
  • 最小化全局内存的使用,尽可能多的共享内存的访问。(5.2节)
  • 避免同线程束(warp)中执行不同路径。(6.1节)

A.3 中等优先级建议

  • 由于bank冲突,共享内存的访问应避免序列化请求。(3.2.21节)
  • 使用共享内存以避免来自于全局内存的多次数据传输。(3.2.2.2节)
  • 为了隐藏由寄存器依赖引起的延迟,每个多流处理器要维持充足的线程(即,充分占用)。(3.2.6节和4.3节)
  • 每block的线程数要是32的倍数,因为这会提供最佳的计算效率和方便合并操作。(4.4节)
  • 无论何时速度胜于精度时都要使用快速数学库。(5.1.4节)
  • 宁可用更快、更专门的数学函数而不是慢的、通用的。(5.1.4节)
  • 循环变量使用有符号整数而不是无符号整数。(6.3节)

A.4 低优先级建议

  • 在CUDA工具包2.2版及其以后版本中,在集成GPU上使用零拷贝操作。(3.1.3节)
  • 对于带长参数列表的核函数,放一些参数到常数内存中以节省共享内存。(3.2.2.4节)
  • 使用移位操作以避免高昂的除和取模计算。(5.1.1节)
  • 避免双精度数到单精度数的自动转换。(5.1.3节)
  • 使用分支谓词代替循环或控制语句让编译器更易于编译。(6.2节)

你可能感兴趣的:(多线程,c,优化,CUDA,性能优化,编译器)