OpenCL的奇怪行为 - 即使单线程GPU输出,CPU输出也不匹配

时间:2012-11-03 10:35:20

标签: opencl

我试图在OpenCL内核中运行以下LUDecomposition代码。 下面的'A'是单精度浮点数组。

for( k = 0; k < N; k++ ) 
{
  for(j=k+1; j < N; j++)    {
      A[k * N + j] = A[k * N + j] / A[k * N + k]; 
  }

  for(i=k+1; i < N; i++)    {
    for (j=k+1; j < N; j++)   { 
      A[i * N + j] = A[i * N + j] - (A[i * N + k] * A[k * N + j]); 
    }
  }
}

我在GPU上仅在一个GPU线程上运行此代码(完全顺序)。所以我有内核的全局线程和本地线程映射如下。

globalthread[0] = 1;
globalthread[1] = 1;

localthread[0] = 1;
localthread[1] = 1;

但是当我将GPU输出与CPU上运行的相同功能的输出进行比较时 (直接而不是作为opencl设备)我看到输出不匹配。 (不匹配超出了浮点精度的限制)。 尽管做了最好的努力,我发现这无法解释。在试图缩小问题的同时, 我发现问题来自第二个陈述。特别是由于减法运算和A [i] [j]的值变为负值。 我确保CPU和GPU都在使用相同的输入。但是这种简单计算的奇怪行为似乎很奇怪。任何人都可以帮助解释为什么输出可能会有所不同? 我也在NVIDIA和AMD设备上运行它,我看到了同样的行为。 (以排除任何平台特定问题)

以下是不匹配的示例输出:

platform name is NVIDIA CUDA
platform version is OpenCL 1.1 CUDA 4.2.1
number of devices is 2
device name is Tesla C2050 / C2070
GPU Runtime: 0.023669s
CPU Runtime: 0.000123s
Values differ at index (45, 40): arr1=0.946256, arr2=0.963078
Values differ at index (60, 52): arr1=-9.348129, arr2=-9.483719
Values differ at index (61, 52): arr1=11.343384, arr2=11.093756
Non-Matching CPU-GPU Outputs Beyond Error Threshold of 1.05 Percent: 3

0 个答案:

没有答案