我对CUDA比较陌生。在运行CUDA程序时,我注意到如果我将数组x[ITERATION]
增加到一定长度,即ITERATION"足够"很大,CUDA代码在执行时会崩溃,同时编译成功。
在C ++中,我可以g++ -Wl,--stack,4194304 program myCode.cc
将堆栈大小增加到4Mb,从而解决了这个问题。有没有办法在CUDA中做到这一点?我试过了nvcc -Wl,--stack,4194304
,但它没有用。
非常感谢提前!
答案 0 :(得分:2)
是的,您可以控制堆栈的大小。它在内核启动之前通过API函数在运行时设置:
cudaDeviceSetLimit(cudaLimit limit, size_t value)
limit
是枚举,指定您要控制的限制。在你的情况下,它将是cudaLimitStackSize
。第二个参数value
是该堆栈的大小(以字节为单位)。
但要小心堆栈大小。 CUDA程序往往会同时运行线程,系统将始终为所有线程维护堆栈内存。因此,您可能会很快耗尽内存。
例如,如果你的目标是4MB堆栈内存,你运行60个块,每个块有512个线程(这些是合理的值!) - 这将是60 * 512 * 4MB =〜30GB的设备内存消耗。大多数GPU的内存都少于此。
通常,大数组最好在所有线程之间共享。