-1

我没有通过迭代方程求解得到好的结果。我正在使用具有“size_y”行的二维数组,每行带有“size_x”元素。

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

这是此解决方案的源文件的 2 部分:

内核代码:

#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;

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

我不明白探针在哪里。如果有人能看出什么是错的。

4

1 回答 1

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) ; \

您错误地写成iiy. 所以程序很可能不会在clCreateProgramWithSource. 因为您没有在 中检查返回码ret,所以您错过了这个事实,然后是以下内容clCreateKernel并且clEnqueueNDRangeKernel也失败了。在没有执行内核的情况下, 的值r_mem_obj保持与其初始值相同 - 全为零,因为它是一个副本r,作为新分配的堆内存,它也是全零(在 Linux 上读取错误页面后新提交的页面是 CoW映射到内核中一个特殊的全零页面)。将所有零相加得出零。

于 2012-09-13T11:55:45.357 回答