使用gpu程序会导致错误

时间:2012-09-13 02:19:31

标签: opencl gpu gpu-programming

迭代方程求解没有取得好成绩。 我正在使用带有“size_y”行的2D数组,每行包含“size_x”元素。

问题是代码只进行一次迭代,因为错误累积等于零。此累积错误在内核代码中为数组的每个单元格计算。

以下是此解决方案的两部分源文件:

内核代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

#define min(a,b) a <= b ? a : b

// kernel code

const char *source =
"__kernel void line_compute(__global double diagx, __global double diagy,\
__global double weightx, __global double weighty, __global int size_x,\
__global double* tab_process, __global double* tab_new, __global double* r) {\
  const unsigned int iy = get_global_id(0);\
  const unsigned int ix = get_global_id(1);\
  /* do computation */\
  tab_process[iy*size_x+ix] = weighty *( tab_new[(iy-1)*size_x+ix] +\
  tab_new[(i+1)*size_x+ix] + tab_new[iy*size_x+ix]*diagy)+\
  weightx *( tab_new[iy*size_x+(ix-1)] + tab_new[iy*size_x+(ix+1)] + tab_new[iy*size_x+ix]*diagx) ; \
  r[iy*size_x+ix] = 0;\
  rk = tab_new[iy*size_x+ix] - tab_process[iy*size_x+ix];\
  r[iy*size_x+ix] =r[iy*size_x+ix]+ rk * rk;\
  tab_new[iy*size_x+ix] = tab_process[iy*size_x+ix]\
}";

在执行时,我打印的累积错误:

result = 0.0;
        for(i=1;i<=size_x*size_y;i++)
             { result = result + r[i];
           printf("r[%d]=%20.18f\n",i,r[i]);
         }

        printf("result=%f\n",result);
        *error=result;

等于零。这就是代码只进行一次迭代的原因。

我不明白探针的位置。 如果有人能看出什么是错的。

1 个答案:

答案 0 :(得分:3)

在向Stack Overflow发布问题时,请仅隔离代码的相关部分(并正确格式化)。这个对于任何人来说太过分了。

除了过早更新内核末尾的tab_new(你应该在所有线程完成后只执行一次因为相邻值是相关的),你在内核源代码中有语法错误:

tab_process[iy*size_x+ix] = weighty *( tab_new[(iy-1)*size_x+ix] +\
>>>  tab_new[(i+1)*size_x+ix] <<< + tab_new[iy*size_x+ix]*diagy)+\
weightx *( tab_new[iy*size_x+(ix-1)] + tab_new[iy*size_x+(ix+1)] + tab_new[iy*size_x+ix]*diagx) ; \

您错误地写了i而不是iy。因此该程序很可能无法在clCreateProgramWithSource中编译。因为您没有检查ret中的返回代码,所以您会错过这一事实,然后以下clCreateKernelclEnqueueNDRangeKernel也会失败。在没有执行内核的情况下,r_mem_obj的值保持与其初始值相同 - 全为零,因为它是r的副本,作为新分配的堆内存,它也全部为零(新的在Linux上读取故障页面后提交CoW映射到内核中的特殊全零页面。总结全零给出零。