1

我正在尝试在 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
4

0 回答 0