公共子表达式消除OpenCL

公共子表达式消除OpenCL,opencl,nvidia,compiler-optimization,Opencl,Nvidia,Compiler Optimization,我有一个非常大的内核,它使用大约1000个临时变量来计算大约1000个方程。因此,可以安全地假设所有的临时变量都将被放在私有片外存储器(也称为CUDA)中,我知道这是不好的,但没有其他方法 我的问题是,相邻行之间是否消除了公共子表达式,如下所示: const float t747 = t472*t28*t26*t715*t30*t11; const float t748 = t472*t28*t717*t26*t30*t11; 正如您所看到的,唯一的区别是变量t717与t715。问题是这两条线

我有一个非常大的内核,它使用大约1000个临时变量来计算大约1000个方程。因此,可以安全地假设所有的临时变量都将被放在私有片外存储器(也称为CUDA)中,我知道这是不好的,但没有其他方法

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

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变量都声明为常量浮点。

编译器将所有全局读取转换为直接读取。所以,在你的例子中,12读

这是因为全局内存被视为易失性内存,不可能进行缓存。然而,如果你只是这么做:我想你知道,但无论如何

const float temp = t472*t28*t26*t30*t11;
const float t747 = temp*t715;
const float t748 = temp*t717;
编译器将把它转换为7次全局读取


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

你认为-cl严格别名和/或-cl快速松弛数学编译器标志会改变什么吗?关于全局内存,被认为是易失性内存:是的,它是硬件中的全局内存,但仍然是软件中的私有内存。因此,没有其他线程能够修改它,这将使它不易失性。至少在我看来,编译器认为我不知道什么。