出现stack overflow后,用 cudaDeviceSetLimit(cudaLimitStackSize, 1024* 2);可以解决问题:
想问一下:
stack内存存放在哪里的?是global还是寄存器?扩大多少比较合适?
LZ您好:
一般可以认为在local memory中,使用的是显存DRAM的空间,但并非是global memory。
需要扩大到多少,和您的需求有关,您可以先自行测试以便确定。
祝您好运~
谢谢您的答复。:handshake
我后来进行了一下设置:
cudaDeviceGetLimit(&value, cudaLimitStackSize);
cudaDeviceSetLimit(cudaLimitStackSize, value * 85);
85KB的stack已经是最大了,再大的话就回到默认的1KB了;
但是我的程序还是出现stack overflow, 我把程序只设为1个线程还是不行。
如果我把double型全部转化成float型的话,就用默认的1KB就可以了,而其可以同时开100个线程以上。
针对我这样的情况,有没有什么好的建议吗?会不会是我的代码的问题。为什么double型可以占用如此多的stack啊,虽然我的程序里有递归,但我还是很疑惑。
LZ您好:
1:stack最大值我没有测试过,2.x以上的GPU local memory最大为512KB per thread,但是这里设置到最大84KB可能还受到其他因素的限制。
2:考虑到您的float和double差距如此巨大,我怀疑您的double的算法实现有问题,建议检查。
3:以及或许您需要修改算法,不使用递归,或者不把大的struct等以值的形式传递。
大致如此,祝您调试顺利~
谢谢您的帮助。
我的stack overflow 的出错信息如下:
StackLimit = 0x00fff840.
我换算成10进制为:16775232,是否意味着栈的限制大小为:16775232字节,即15.9981M?
LZ您好:
我不清楚这个值是否真的表示栈的大小限制,以及考虑到这个大小已经超过了单个thread的local memory的最大允许容量,而栈使用的是local memory的空间,那么如果这个值是栈的容量限制,那么他表示的可能是多个线程的总容量限制。
请其他知情的网友/斑竹/总版主/NV原厂支持人员予以补充。
祝您好运~
LZ您好:
我不清楚这个值是否真的表示栈的大小限制,以及考虑到这个大小已经超过了单个thread的local memory的最大允许容量,而栈使用的是local memory的空间,那么如果这个值是栈的容量限制,那么他表示的可能是多个线程的总容量限制。
请其他知情的网友/斑竹/总版主/NV原厂支持人员予以补充。
祝您好运~
谢谢版主
不客气的,欢迎您常来论坛~