我有一个非常大的内核,它使用 ~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”。