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 デバイスとしてではなく直接)、出力が一致していないことがわかります。(不一致は浮動小数点精度の限界を超えています)。最善の努力を尽くしたにもかかわらず、これは説明のつかないものであることがわかりました。問題を絞り込もうとしているうちに、問題は2番目のステートメントから発生することがわかりました。具体的には、減算操作が原因で、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