我正在尝试在我的 GPU 上测量峰值单精度触发器,因为我正在修改 PTX 文件以在寄存器上执行连续的 MAD 指令。不幸的是,编译器正在删除所有代码,因为它实际上没有任何用处,因为我没有执行任何数据加载/存储。是否有编译器标志或编译指示添加到代码中,以便编译器不会触及它?
谢谢。
我正在尝试在我的 GPU 上测量峰值单精度触发器,因为我正在修改 PTX 文件以在寄存器上执行连续的 MAD 指令。不幸的是,编译器正在删除所有代码,因为它实际上没有任何用处,因为我没有执行任何数据加载/存储。是否有编译器标志或编译指示添加到代码中,以便编译器不会触及它?
谢谢。
要完全禁用 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、-Xcicc 和 -Xptxas 标志是组件级标志,除非在 nvcc 手册中记录,否则应视为不受支持。
我认为没有任何方法可以在编译器中关闭这种优化。您可以通过添加代码来存储您的值并将该代码包装在始终为假的条件语句中来解决此问题。要使编译器无法确定始终为假的条件,请至少使用一个变量(而不仅仅是常量)。
(我还在CUDA 4.0,可能随着新版本发生了变化)
要禁用ptxas
(将 ptx 转换为 cubin 的工具)的优化,您需要传递一个选项--opt-level 0
(默认为--opt-level 3
)。如果你想通过这个选项,nvcc
你需要在它前面加上--ptxas-options
.
但是请注意,这ptxas
会进行很多有用的优化——当禁用时——如果完全不正确,可能会使您的代码变得更慢!例如,它进行寄存器分配并尝试预测共享内存和全局内存的位置。
这些对我有用:
-g -G -Xcompiler -O0 -Xptxas -O0 -lineinfo -O0
据我所知,没有编译器标志或编译指示。但你可以计算更多,存储更少