2011-05-11 73 views
0

我已经写了一个简单的程序,如下所示执行自相关...我已经使用pgi加速器指令将计算移动到GPU。OpenCL自相关内核

//autocorrelation 
void autocorr(float *restrict A, float *restrict C, int N) 
{ 
     int i, j; 
     float sum; 
     #pragma acc region 
     { 
     for (i = 0; i < N; i++) { 
         sum = 0.0; 
       for (j = 0; j < N; j++) { 
        if ((i+j) < N) 
         sum += A[j] * A[i+j]; 
        else 
         continue; 
       } 
      C[i] = sum; 
     } 
     } 
} 

我在OpenCL中写了一个类似的程序,但是我没有得到正确的结果。该程序如下...我是GPU编程的新手,除了可以解决我的错误的提示外,欢迎任何其他建议。

__kernel void autocorrel1D(__global double *Vol_IN, __global double *Vol_AUTOCORR, int size) 
{ 

    int j, gid = get_global_id(0); 
    double sum = 0.0; 

    for (j = 0; j < size; j++) { 
      if ((gid+j) < size) 
      { 
       sum += Vol_IN[j] * Vol_IN[gid+j]; 
      } 
      else 
       continue; 
       } 

    barrier(CLK_GLOBAL_MEM_FENCE); 
    Vol_AUTOCORR[gid] = sum; 

} 

因为我已经通过了尺寸为1,所以我考虑get_global_size(0)调用会给我当前块,用于访问输入一维数组的ID。

感谢,
萨扬

+0

你会得到什么结果?如果您将'Vol_AUTOCORR [g​​id] = sum;'更改为'Vol_AUTOCORR [g​​id] = gid;',是否会给您预期的递增值数组? – 2011-05-11 22:17:44

+0

我在这里没有看到问题?你的主机代码是什么?您是否将数据正确传输到设备并返回? – 2011-05-13 15:21:36

+0

很抱歉,对于最近的回复......内核没有任何问题,我在主机代码中出错,导致结果出错。感谢您的评价。 – Sayan 2011-05-16 01:40:16

回答

1

的代码是正确的。据我所知,这应该运行良好,并给出相应的结果。

barrier(CLK_GLOBAL_MEM_FENCE);不需要。没有这句话你会得到更多的速度。

你的问题应该在内核之外,检查你是否正确地传递了输入,并且你正在从GPU中取出正确的数据。

顺便说一句,我建议你使用双精度支持GPU,因为你正在做双计算。 检查您是否传递了双值。请记住,您不能将浮点指针指向double值,反之亦然。这会给你错误的结果。

+0

是的,我注意到在这种情况下不需要BARRIER。感谢您指点我的数据类型。 – Sayan 2011-05-26 05:06:36