0
__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常量内存/缓存吗?由于编码标准,我不想将“const”放在按值传递的原始类型前面。

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

4

1 回答 1

2

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

__constant__除非您使用适当的装饰/用法,否则任何类型的其他常量都不会自动放置在常量内存中。

在内核参数之外,指定:

const int mid = windowsize/2;

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

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

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

const int mid = windowsize/2;

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

对此的逻辑扩展是您不能执行以下操作:

__constant__ int mid = windowsize/2;

在你的内核代码中,突然在__constant__内存中声明一个变量。这些声明必须在全局/文件范围内进行。

于 2020-11-26T04:00:58.543 回答