2

我有一个非常大的内核,它使用 ~1000 个临时变量来计算 ~1000 个方程。因此可以安全地假设所有临时变量都将放入私有片外内存,即 CUDA __local 内存(我知道这很糟糕,但没有其他办法)。

我的问题是,是否消除了相邻行之间的常见子表达式,如下所示:

const float t747 = t472*t28*t26*t715*t30*t11;
const float t748 = t472*t28*t717*t26*t30*t11;

如您所见,唯一的区别是变量 t717 与 t715。问题是这两行是否转化为 7 或 12 个全局负载?

因为如果目标编译器(在我的例子中是 Nvidia Kepler GPU)不使用寄存器来缓存行之间的公共子表达式,我将需要自己实现它。

注意:所有代码都是自动生成的,因此无法手动调整。

编辑:所有 t0-t999 变量都声明为“const float”。

4

1 回答 1

0

编译器将所有全局读取转换为直接读取。所以,在你的情况下12读取。

这是因为全局内存被视为易失性内存,无法进行缓存。但是,如果你只是这样做:(我想你知道,但无论如何......)

const float temp = t472*t28*t26*t30*t11;
const float t747 = temp*t715;
const float t748 = temp*t717;

编译器会将其转换为 7 个全局读取。

注意:至少这对于旧架构是有效的,我不知道是否有一些新的编译器/架构可以巧妙地检测这些情况并优化它们。

于 2013-09-20T17:54:56.653 回答