我在Matlab mex-Files中编写CUDA。当您查看互联网上的CUDA示例或甚至来自nvidia的手册时,您经常会看到使用预处理变量来指定问题大小,例如:向量加法的向量长度或类似的东西。我编写了我的程序,如下所示:预处理变量用于指定问题大小。我不得不承认:我喜欢它,因为你可以访问代码中的所有地方,例如作为循环中的限制或类似的东西,而不必通过参数显式地将它们传递给函数。
但我遇到了以下问题:我想为几个不同的问题大小调整程序,因此我需要每次通过将预处理变量传递给编译器来编译代码。这不是问题,我已经编写了基准测试并且它有效。但我现在只是想知道为什么我选择这个版本并且不是简单地通过运行时的用户输入来指定它。因此,我正在寻找可能想要使用预处理变量而不是简单地将问题大小传递给程序的原因。
谢谢!
答案 0 :(得分:4)
当您在内核中编译问题大小常量时,如果只在运行时知道大小,编译器可以进行某些优化类。完整循环展开是一个明显的例子。
在其他情况下,例如共享内存数组大小,如果编译大小则更清楚;否则,您必须在内核启动时传入总共享内存大小,并将该内存分解为所需的共享阵列数。这样可以正常工作,但是如果你只能拥有静态声明,那么代码就更清晰了,你需要编译时的大小。
答案 1 :(得分:2)
主要原因是通常问题大小将与GPU架构密切相关,例如每个块的线程数,块数,每个线程的共享内存量,每个线程的寄存器数等。通常,这些数字都经过精心调整,以获得可用资源的最大使用量,并且您无法轻易地更改问题大小动态,同时仍保持最佳性能。