OpenCL的奇怪行为-CPU输出甚至与单线程GPU输出不匹配

OpenCL的奇怪行为-CPU输出甚至与单线程GPU输出不匹配,opencl,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[

我试图在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输出与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

矩阵的条件编号是什么?1-norm=7.07278e+3和inf-norm=5.41371e+3的条件编号。所以我失去了3-4位数的准确度,对吗?但据我所知,条件数是矩阵的属性,而不是计算设备。那么CPU和GPU不应该出现同样的错误吗?为什么CPU和GPU输出不匹配?一些样本不匹配是:索引(45,40)处的值不同:arr1=0.946256,arr2=0.963078索引(60,52)处的值不同:arr1=-9.348129,arr2=-9.483719索引(61,52)处的值不同:arr1=11.343384,arr2=11.093756使用双精度值解决了我的问题。我想我有一个解释:(如果我错了,请纠正我)。1.使用单精度浮点导致CPU和GPU之间计算的中间浮点值存在微小差异。2.由于高条件数字,除舍入误差外,我损失了高达3位数的精度。这种不良条件导致最终结果差异显著增大。而当我使用double时,CPU和GPU之间没有舍入误差。因此,即使使用病态矩阵,我也能够得到准确的结果。下面是我遇到的一篇文章,描述了OpenCL中的浮点精度问题。
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