CUDA 内核是否需要将 const 放入所有按值传递参数中?

CUDA kernel do I need to put const in all pass-by-value parameters?

__global__
void diff2D(int top, int left, (const int windowSize or int windowSize), float* a1, float* a2)
{
    (const int mid or int mid) = windowsize / 2;
    ... // templateSize, windowSize are all const. 
} 

我的问题是我是否需要显式使用“const int windowSize”关键字让编译器将 mid 放入常量 memory/cache?由于编码标准,我不想将“const”放在按值传递原始类型前面。

常量参数放入常量缓存。但是我不知道内核内部评估的常量是否也会放在那里。

任何类型的所有内核参数都通过常量内存传递。参见 here。参数的类型或装饰与此功能无关。

除非您使用适当的 __constant__ decoration/usage.

,否则不会自动将任何类型的其他常量放入常量内存中

在内核参数之外,指定:

const int mid = windowsize/2;

不会导致任何内容被放置在常量内存中。

考虑常量内存的一种方式是它在全局范围内。这对于内核参数使用(所有线程都可以访问它们)和 __constant__ 声明(所有线程都可以访问它们)都是有意义的。

当你声明一个普通局部变量时:

const int mid = windowsize/2;

不在全局范围内,它具有逻辑线程局部范围。

这的逻辑扩展是你不能做这样的事情:

__constant__ int mid = windowsize/2;

在您的内核代码中,突然在 __constant__ 内存中声明一个变量。这些声明必须在 global/file 范围内进行。