【发布时间】:2015-10-12 16:45:53
【问题描述】:
假设我想要一个需要做很多事情的 CUDA 内核,但有一些圆顶参数对于所有内核都是不变的。此参数作为输入传递给主程序,因此不能在 #DEFINE 中定义。
内核将运行多次(大约 65K),它需要这些参数(和一些其他输入)来进行数学运算。
我的问题是:将这些常量传递给内核的最快(或者最优雅)的方式是什么?
常量是 2 或 3 个元素长度的 float* 或 int* 数组。它们将是其中的 5~10 个。
玩具示例:2个常量const1和const2
__global__ void kernelToyExample(int inputdata, ?????){
value=inputdata*const1[0]+const2[1]/const1[2];
}
是不是更好
__global__ void kernelToyExample(int inputdata, float* const1, float* const2){
value=inputdata*const1[0]+const2[1]/const1[2];
}
或
__global__ void kernelToyExample(int inputdata, float const1x, float const1y, float const1z, float const2x, float const2y){
value=inputdata*const1x+const2y/const1z;
}
或者也许在一些全局只读内存中声明它们并让内核从那里读取?如果是这样,L1,L2,全球?哪一个?
有没有更好的方法我不知道?
在 Tesla K40 上运行。
【问题讨论】:
-
我在某处读到,您应该按值传递内置类型以获得最佳效率。
-
@StraightLine 很有趣。有什么来源吗?我猜对于一般的变量,但是这一堆不变的呢?能否将它们放在快速存取存储器中的某个位置,并具有比实际发送 65K 副本更好的性能?
-
一些优化取决于您设备的计算能力。您可以利用 64KB 的常量内存。您还可以将所有常量值排列在一个数组中,并告诉编译器该内存空间将保持不变。