由于我的GPU设备Quadro FX 3700不支持arch> sm_11。我无法使用可重定位的设备代码( rdc )。因此,我将所需的所有实用程序合并为一个大文件(比如x.cu )。 为了概述 x.cu ,它包含2个类,每个类有5个成员函数,20个设备函数,1个全局内核,1个内核调用函数。
现在,当我尝试通过Nsight进行编译时,它只是挂起显示 Build%as 3 。 当我尝试使用
进行编译时nvcc x.cu -o output -I"."
它显示以下消息并在很长一段时间后编译,
/tmp/tmpxft_0000236a_00000000-9_Kernel.cpp3.i(0): Warning: Olimit was exceeded on function _Z18optimalOrderKernelPdP18PrepositioningCUDAdi; will not perform function-scope optimization.
To still perform function-scope optimization, use -OPT:Olimit=0 (no limit) or -OPT:Olimit=45022
/tmp/tmpxft_0000236a_00000000-9_Kernel.cpp3.i(0): Warning: To override Olimit for all functions in file, use -OPT:Olimit=45022
(Compiler may run out of memory or run very slowly for large Olimit values)
optimalOrderKernel 是全局内核。编译不应该花费太多时间。我想了解这些消息背后的原因,特别是Olimit。
答案 0 :(得分:1)
Olimit
非常清楚。这是编译器对优化代码所花费的精力的限制。
大多数代码使用nvcc
编译得很好。但是,没有编译器是完美的,一些看似无害的代码会导致编译器花费很长时间在通常很快的优化过程中。
由于你没有提供任何代码,我说的是一般性的。
由于偶尔会出现编译器在某些优化阶段花费不成比例的长时间的情况,Olimit
提供了一个方便的监视器,因此您可以了解它为什么花费这么长时间。此外,Olimit
在优化过程中扮演监督者的角色,这个过程耗时太长。超过时,会中止某些优化步骤,而是生成代码的“欠优化”版本。
我认为您收到的编译器消息非常清楚如何根据您的意图修改Olimit
。您可以覆盖它以增加看门狗周期,或完全禁用它(通过将其设置为零)。在这种情况下,编译过程可能会花费任意长的时间,和/或耗尽内存,如消息所示。