Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
openCL中是否存在代码提升?如果没有,有没有办法实施?_Opencl - Fatal编程技术网

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

openCL中是否存在代码提升?如果没有,有没有办法实施?,opencl,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

我想知道代码提升是否存在于包括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;
    }
  }
}
//只是对变量random\u private进行了一些复杂的操作
#定义零随机私密[0]*随机私密[1]*随机私密[2]*随机私密[3]*随机私密[4]*随机私密[5]*随机私密[6]*随机私密[7]*随机私密[8]*随机私密[9]
#定义零1功率((双)零*零+零,10)
#定义零2零1/(零1+1)
#定义zero3 zero2+zero2*zero2
//测试代码是否存在
//C=A+B+某物
内核无效矩阵_add1(全局双精度*A、全局双精度*B、全局双精度*C、全局uint*随机){
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]};
对于(uint j=0;j