Optimization 完全禁用NVCC上的优化

Optimization 完全禁用NVCC上的优化,optimization,cuda,gpu,nvcc,Optimization,Cuda,Gpu,Nvcc,我试图在我的GPU上测量峰值单精度触发器,为此我修改了一个PTX文件,以便在寄存器上执行连续的MAD指令。不幸的是,编译器正在删除所有代码,因为它实际上没有任何用处,因为我不执行任何数据加载/存储。是否有要添加到代码中的编译器标志或pragma,以便编译器不会触及它 谢谢。据我所知,没有编译器标志或pragma。但是您可以计算更多,存储更少我认为没有任何方法可以在编译器中关闭这种优化。您可以通过添加代码来存储您的值,并将代码包装在一个始终为false的条件语句中来解决这个问题。若要使编译器无法确

我试图在我的GPU上测量峰值单精度触发器,为此我修改了一个PTX文件,以便在寄存器上执行连续的MAD指令。不幸的是,编译器正在删除所有代码,因为它实际上没有任何用处,因为我不执行任何数据加载/存储。是否有要添加到代码中的编译器标志或pragma,以便编译器不会触及它


谢谢。

据我所知,没有编译器标志或pragma。但是您可以计算更多,存储更少

我认为没有任何方法可以在编译器中关闭这种优化。您可以通过添加代码来存储您的值,并将代码包装在一个始终为false的条件语句中来解决这个问题。若要使编译器无法确定的条件始终为false,请至少使用一个变量(不仅仅是常量)。

(我仍在使用CUDA 4.0,它可能已随新版本而更改)

要禁用
ptxas
(将ptx转换为cubin的工具)的优化,您需要传递一个选项
--opt level 0
(默认值为
--opt level 3
)。如果要通过
nvcc
传递此选项,则需要在其前面加上
--ptxas options


但是请注意,
ptxas
做了很多有用的优化,如果禁用了这些优化,那么代码可能会变得更慢,甚至更不正确!例如,它确实注册分配,并尝试预测共享的位置和全局内存的位置。

要完全禁用nvcc优化,可以使用以下方法:

nvcc -O0 -Xopencc -O0 -Xptxas -O0  // sm_1x targets using Open64 frontend
nvcc -O0 -Xcicc -O0 -Xptxas -O0 // sm_2x and sm_3x targets using NVVM frontend
请注意,生成的代码可能非常慢。将-O0标志传递给主机编译器以禁用主机代码优化。-Xopencc-O0和-Xcicc-O0标志控制编译器前端(生成PTX的部分)并关闭那里的优化。-Xptxas-O0标志控制编译器后端(将PTX转换为机器代码的部分),并关闭该部分中的优化。请注意,-Xopencc、-xICC和-Xptxas标志是组件级标志,除非nvcc手册中有说明,否则应视为不受支持。

这些标志对我有用:


-g-g-Xcompiler-O0-Xptxas-O0-lineinfo-O0

内联PTX可能工作吗?在这种情况下,我认为编译器必须包含您的代码,尽管我自己从未尝试过。@sj755:这里的问题可能是汇编程序造成的,内联PTX在这种情况下没有帮助。这是一种规范的方法。如果将保护写操作的伪标志放入常量内存中,则会得到常量缓存+广播,只要内核的计算阶段有足够的FLOPs/IOPs,它对总体性能的影响就很小。这些是哪个命令的标志?另外,请解释一下他们做了什么,以及为什么他们解决了OP的问题……这确实使我的GPU上的代码速度变慢了,但这表明标志是有效的。即使生成的PTX也有未优化的代码。真是奇迹,谢谢你!