use*_*290 11 cuda nvcc compiler-options
使用C或C++编译器时,如果我们通过-O3
交换机,执行会变得更快.在CUDA中,有没有相同的东西?
我正在使用该命令编译我的代码nvcc filename.cu
.之后我执行./a.out
.
Luc*_*aro 18
警告:编译nvcc -O3 filename.cu
将仅将-O3选项传递给主机代码.
为了优化CUDA内核代码,必须将优化标志传递给PTX编译器,例如:
nvcc -Xptxas -O3,-v filename.cu
将要求优化级别3到cuda代码(这是默认值),同时-v
请求详细编译,它报告了我们可以考虑用于进一步优化技术的非常有用的信息(稍后将详细介绍).
可用于nvcc编译器的另一个速度优化标志-use_fast_math
是以浮点精度为代价使用内在函数(请参阅引导GPU代码生成的选项).
无论如何,根据我的经验,这种自动编译器优化选项通常无法实现很大的提升.通过显式编码优化可以实现最佳性能,例如:
-maxrrregcount=N
选项.内核需要的寄存器越少,就越有资格同时运行(直到寄存器溢出将接管).#pragma unroll N
在CUDA内核中的任何独立循环(如果有)之前添加.N可以是2,3,4.当您在注册压力和实现展开水平之间达到良好平衡时,可以获得最佳结果.这种方法毕竟属于ILP技术.float A[N],B[N]
到一个float2 AB[N]
数据缓冲区中.这将转化为负载/存储单元和总线使用效率的更少操作.当然,始终始终检查您的代码,以便合并内存访问全局内存并避免共享内存中的库冲突.使用nVIDIA Visual Profiler可以更深入地了解此类问题.
nvcc
支持许多与CPU目标C/C++编译器类似的选项.这在nvcc文档中有记录 ; 你也可以运行nvcc --help
以获得这些选项的详细描述(也许nvcc --help | less
能够更容易地滚动它们).
实际上,默认优化级别-O3
(除非您指定-G
,否则用于调试,禁用大多数优化).您也可以指定-O0
或-O1
等,但只会禁用优化.
如果您只想优化将在GPU上运行的代码,而不是将在CPU上运行的代码,则可以将不同的优化开关直接传递给ptxas设备代码编译器.
此外,如果您编写nvcc -o foo filename.cu
生成的可执行文件将被命名foo
而不是a.out
,以防您需要可执行文件的有意义的名称.这也与C/C++编译器相同.