由于我的GPU设备Quadro 3700不支持arch>sm_11,所以我无法使用可重定位的设备代码。因此,我将所需的所有实用程序合并到一个大文件中(比如x.cu)。为了概述x.cu,它包含两个类,每个类有5个成员函数,20个设备函数,1个全局内核,1个内核调用函数。
现在,当我尝试通过Nsight编译时,它只是挂起显示Build%为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。
发布于 2014-01-13 19:56:26
我认为Olimit是相当清楚的。它限制了编译器在优化代码上所花费的精力。
大多数代码都使用nvcc编译得很好。然而,没有一个编译器是完美的,一些看似无害的代码可能会导致编译器花很长时间在一个通常是快速的优化过程中。
既然你没有提供任何代码,我只是泛泛而谈。
由于偶尔会出现编译器在某些优化阶段花费不成比例的时间的情况,所以Olimit提供了一个方便的监视狗,因此您对为什么要花费这么长的时间有了一些了解。此外,Olimit的作用就像对一个花费太长时间的优化过程的看门狗。当超出时,某些优化步骤将被中止,取而代之的是生成代码的“较低优化”版本。
我认为您收到的编译器消息非常清楚如何根据您的意图修改Olimit。您可以重写它以增加看门狗周期,或者完全禁用它(通过将其设置为零)。在这种情况下,如消息所示,编译过程可能会花费任意长的时间和/或耗尽内存。
https://stackoverflow.com/questions/20998005
复制相似问题