代码之家  ›  专栏  ›  技术社区  ›  Min

在C++中,是否有“-Wl,-stack,[一个数字,例如4194304表示4Mb的堆栈]”的CUDA等价物?

  •  -1
  • Min  · 技术社区  · 6 年前

    我对CUDA比较陌生。运行CUDA程序时,我注意到如果我增加一个数组 x[ITERATION] 到了一定的长度,即迭代“足够”大,CUDA代码将在执行时崩溃,同时被成功编译。

    在C++中,我可以 g++ -Wl,--stack,4194304 program myCode.cc 将堆栈大小增加到4Mb,解决了此问题。有没有办法在CUDA做到这一点?我试过了 nvcc -Wl,--stack,4194304 但它不起作用。

    非常感谢!

    1 回复  |  直到 6 年前
        1
  •  2
  •   CygnusX1    6 年前

    是的,您可以控制堆栈的大小。它是在内核启动之前的运行时通过API函数设置的:

    cudaDeviceSetLimit(cudaLimit limit, size_t value)
    

    这个 limit 是枚举,指定要控制的限制。如果是你的话 cudaLimitStackSize .第二个参数 value 是该堆栈的大小(以字节为单位)。

    Full documentation

    但要注意堆栈大小。CUDA程序往往有数千个线程同时运行,系统将始终为所有线程维护堆栈内存。因此,您可能会很快耗尽内存。

    例如,如果您的目标是4MB堆栈内存,并且运行60个块,每个块中有512个线程(这些都是合理的值!)-这将是60*512*4MB=约30GB的设备内存消耗。大多数GPU的内存都比这少。

    通常,大数组最好在所有线程之间共享。