C++ CUDA内核我需要在所有传递值参数中设置常量吗?

C++ CUDA内核我需要在所有传递值参数中设置常量吗?,c++,cuda,constants,compiler-optimization,gpu-constant-memory,C++,Cuda,Constants,Compiler Optimization,Gpu Constant Memory,我的问题是,我是否需要显式使用“const int windowSize”关键字使编译器将mid放入常量内存/缓存中?由于编码标准,我不想将“const”放在pass-by-value原语类型前面 常量参数被放入常量缓存中。但是我不知道在内核中计算的常量是否也会放在那里。任何类型的内核参数都是通过常量内存传递的。看见参数的类型或装饰与此功能无关 任何类型的其他常量都不会自动放入常量内存中,除非您使用了适当的\uuuuu常量修饰/用法 在内核参数之外,指定: __global__ void dif

我的问题是,我是否需要显式使用“const int windowSize”关键字使编译器将
mid
放入常量内存/缓存中?由于编码标准,我不想将“const”放在pass-by-value原语类型前面


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

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

任何类型的其他常量都不会自动放入常量内存中,除非您使用了适当的
\uuuuu常量
修饰/用法

在内核参数之外,指定:

__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. 
} 
不会导致任何内容被放置在恒定内存中

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

声明普通局部变量时:

const int mid = windowsize/2;
它不在全局范围内,它具有逻辑线程本地范围

逻辑扩展是,您不能执行以下操作:

const int mid = windowsize/2;

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

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

任何类型的其他常量都不会自动放入常量内存中,除非您使用了适当的
\uuuuu常量
修饰/用法

在内核参数之外,指定:

__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. 
} 
不会导致任何内容被放置在恒定内存中

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

声明普通局部变量时:

const int mid = windowsize/2;
它不在全局范围内,它具有逻辑线程本地范围

逻辑扩展是,您不能执行以下操作:

const int mid = windowsize/2;

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

因此,如果我想将“mid”放在常量内存中而不是寄存器中,我必须将其作为参数传递,是否正确?@DukeLe是否在尝试减少寄存器使用?是的。我不知道将常用变量(如循环次数、过滤器高度/宽度等)放入常量内存(而不是寄存器)是否值得考虑。说“而不是寄存器”是不明智的。在大多数情况下,GPU SASS指令从寄存器中提取操作数。内存中的数据在您使用它做任何有用的事情之前都会被移动到寄存器中。实际上,对于直接从常量内存中提取的操作数,或者直接从指令流中提取的常量操作数,确实有一些例外情况,但在我看来,试图关注这一点是不明智的。基本上,您无法控制在常量内存中开始使用的操作数最终是否会使用寄存器。通常是这样。因此,如果我想将“mid”放在常量内存中而不是寄存器中,我必须将其作为参数传递,对吗?@DukeLe您是否在尝试减少寄存器的使用?是的。我不知道将常用变量(如循环次数、过滤器高度/宽度等)放入常量内存(而不是寄存器)是否值得考虑。说“而不是寄存器”是不明智的。在大多数情况下,GPU SASS指令从寄存器中提取操作数。内存中的数据在您使用它做任何有用的事情之前都会被移动到寄存器中。实际上,对于直接从常量内存中提取的操作数,或者直接从指令流中提取的常量操作数,确实有一些例外情况,但在我看来,试图关注这一点是不明智的。基本上,您无法控制在常量内存中开始使用的操作数最终是否会使用寄存器。很多时候,它会。