0

openCL プログラムで異常な動作が発生しています。

プログラムのホスト部分で、double の配列を作成し、すべての要素をゼロに設定します。その配列は、次を使用して GPU にコピーされます。

memObjects[4] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR,
                             sizeof(double) * I_numel, I, NULL);

カーネル内では、条件に応じて一部の要素が 1 に設定され、次のようにホストに読み戻されます。

errNum = clEnqueueReadBuffer(commandQueue, memObjects[4], CL_TRUE, 0,
                           I_numel * sizeof(double), I, 0, NULL, NULL);

ただし、ゼロになるはずだった要素の一部が、非常に小さな値 ( 6.953267903e-310 ) または非常に大きな値 ( 2.0002319483e+161 ) に変更されました!?!

double を float に変更しようとしましたが、結果は似ています。私はopenCLのnvidia実装を使用しています。バージョンは1.1です。誰が問題が何であるか知っていますか?

4

2 に答える 2

0

表示されたコードをこれに置き換えてみて、エラー番号を投稿してください

cl_int err;
memObjects[4] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR,
                             sizeof(double) * I_numel, I, &err);

printf("Buffer creation error no = %d", err);

そして、コピーバックのために

cl_int err2;
err2= clEnqueueReadBuffer(commandQueue, memObjects[4], CL_TRUE, 0,
                           I_numel * sizeof(double), I, 0, NULL, NULL);
printf("Copy back error no = %d", err2);
于 2012-12-12T17:23:41.920 に答える
0

カーネル コードに何か問題があると思われます。カーネルをまったく実行せずに clEnqueueRead だけを実行するとどうなりますか? すべてゼロになりますか? CL_MEM_COPY_HOST_PTR をドロップして、代わりに clEnqueueWrite でバッファをクリアするとどうなりますか?

この単純化されたカーネルで問題を再現しようとしましたが、予想どおり、出力は 0 と 1 が交互に表示されるだけでした。

kernel void enqueueReadBuffer(global float* outputValueArray) {
  int gid = get_global_id(0);
  if (gid % 2 == 0) {
    outputValueArray[gid] = 1.0f;
  }
}

NVIDIA Quadro FX4800 (R307.45) を含む、Windows 7 上の 3 つの異なる OpenCL ドライバーでこれを実行したところ、すべてで正しい結果が得られました。

于 2012-12-12T13:58:47.323 に答える