openCL中是否存在代码提升?如果没有,有什么办法可以实施?

时间:2019-02-03 04:30:23

标签: opencl

我想知道代码提升是否在包括Nvidia,AMD和Intel在内的各种平台上存在。我创建了一个简单的示例,似乎该功能不存在。由于我还不熟悉openCL,所以我不知道我是否正确测试了它。该示例代码仅执行矩阵加法并为每个条目添加一个常量,这是代码:

//Just some complicate operation on the variable random_private
#define zero random_private[0]*random_private[1]*random_private[2]*random_private[3]*random_private[4]*random_private[5]*random_private[6]*random_private[7]*random_private[8]*random_private[9]
#define zero1 powr((double)zero*zero+zero,10)
#define zero2 zero1/(zero1+1)
#define zero3 zero2+zero2*zero2

//Test if the code hoisting exist
//C=A+B+something
kernel void matrix_add1(global  double *A,  global  double *B,global  double *C ,global uint* random) {
  uint rowNum=10000;
  uint colNum=100;
//localize the variable random to make sure the code hoisting is valid(Otherwise it is possible that the variable random can be changed by other thread when excuting the loop and therefore the code hoisting results in incorrect answer)
  uint random_private[10]={random[0],random[1],random[2],random[3],random[4],random[5],random[6],random[7],random[8],random[9]};
  for(uint j=0;j<colNum;j++){
    for(uint i=0;i<rowNum;i++){
//zero3 is a macro to do some super complicate operation on random_private
      C[i+j*rowNum]=A[i+j*rowNum]-B[i+j*rowNum]+zero3;
    }
  }
}

//Manually do the code hoisting
kernel void matrix_add2(global  double *A,  global  double *B,global  double *C ,global uint* random) {
  uint rowNum=10000;
  uint colNum=100;
  uint random_private[10]={random[0],random[1],random[2],random[3],random[4],random[5],random[6],random[7],random[8],random[9]};
//Compute the loop-invariant code
  uint tmp=zero3;
  for(uint j=0;j<colNum;j++){
    for(uint i=0;i<rowNum;i++){
      C[i+j*rowNum]=A[i+j*rowNum]-B[i+j*rowNum]+tmp;
    }
  }
}

该示例仅使用一个线程即可运行20次,这是我计算机上的结果:

Nvidia 1070:

matrix_add1:28.46秒

matrix_add2:4.3秒

AMD 1600X:

matrix_add1:5.78秒

matrix_add2:0.16秒

函数matrix_add1比函数matrix_add2慢得多。我在这个例子上有没有犯错?还是有任何第三方编译器可以实现这种优化并为我们生成中间代码?谢谢!

0 个答案:

没有答案