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 范围内进行。
__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 范围内进行。