OpenCL自相关核

OpenCL自相关核,opencl,Opencl,我已经写了一个简单的程序,做如下的自相关…我使用pgi加速器指令将计算转移到GPU //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++) { su

我已经写了一个简单的程序,做如下的自相关…我使用pgi加速器指令将计算转移到GPU

//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;
       }
       }
}
//自相关
void autocorr(浮点*限制A,浮点*限制C,整数N)
{
int i,j;
浮点数;
#布拉格马行政协调区
{
对于(i=0;i
我在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;

}
\uuuuu内核无效自动相关1d(\uuuu全局双精度*Vol\u IN,\uuuuu全局双精度*Vol\u自动相关,int size)
{
int j,gid=get_global_id(0);
双和=0.0;
对于(j=0;j
由于我已将维度传递为1,因此我正在考虑我的get_global_size(0)调用将为我提供当前块的id,该块用于访问输入1d数组

谢谢,

Sayan

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

屏障(CLK_GLOBAL_MEM_FENCE)是不需要的。没有那句话你会更快

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

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

你会得到什么结果?如果您更改
Vol_AUTOCORR[gid]=sum至<代码>音量自动调节[gid]=gid,这是否为您提供了预期的递增值数组?我看不出有问题?你的主机代码是什么?您是否正确地将数据传输到设备并返回?很抱歉,回复太晚…内核没有任何问题,我在主机代码中出错,导致结果不正确。谢谢评估。是的,我注意到在这种情况下不需要屏障。感谢您为我指出数据类型。