【发布时间】:2014-05-17 05:25:30
【问题描述】:
我正在尝试在 Visual Studio 中使用 Nsight 进行调试,并在其中一个函数调用上出现“DataStackOverflow”异常(调用堆栈由 4 个设备函数调用组成)。
上面写着:
StackPointer = 0x00fff7e8 and StackLimit = 0x00fff950.
正如格雷格史密斯在他的评论中所说:堆栈在地址上增长。 此外,Greg 注意到默认情况下,编译器会决定设备函数是否内联。
我在我的设备功能中添加了__forceinline__ 关键字。我的全局函数接收 8 个指向全局 RAM 的指针(8 * 4 = 32 字节)+ 1 int(小于 256 字节限制)。
但是现在我在全局内部的第一个非内联函数调用中遇到堆栈溢出异常(例如 make_float4)。
因此,为什么 NVCC 说“你的内核没问题,你有足够的资源”,但我在运行时得到这个异常?
【问题讨论】:
-
是的,堆栈在地址上向下增长(与大多数处理器相同)。所有设备功能都内联在计算能力 1.x 处理器上。对于 2.x、3.x 和 5.x,编译器可以选择内联或调用函数。计算能力 2.0 是第一个添加 ABI 的。默认编译选项是使用 ABI。
-
我向他们添加了 forceinline 关键字,并认为这会有所帮助。但是现在堆栈溢出异常是由标准 vector_types 函数(如 make_float4)引起的。我的内核接收了很多参数,但如果这是一个问题:为什么当我没有任何 forceinline 关键字时,第一个设备函数调用上没有出现异常?
-
您没有提供可重现的。我建议您在具有混合模式显示的 CUDA 调试器中单步执行代码并理解生成的代码。
-
“因此,为什么 NVCC 会说“你的内核没问题,你有足够的资源”,”NVCC 从来没有这样说。在这个 cuda 标签上有很多例子,人们的程序编译得很好,然后在内核启动时耗尽了资源。编译器通常不保证代码的正确性。在不提供任何代码的情况下询问“为什么我的代码会产生此运行时错误”可能不会有成效。投票结束。