0

誰かがこれで私を助けてくれることを願っています。

次のようなものを使用して、行列を表す長い配列をopenclカーネルに渡す必要があります。

memObjects[2] = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR,
                               sizeof(double) * dets_numel, dets, NULL);

カーネル内では、条件に応じて行列の行をいくつか削除し、次のようなものを使用してホストに読み返したいと考えています。

errNum = clEnqueueReadBuffer(commandQueue, memObjects[2], CL_TRUE, 0,
                             dims1[0] * dims1[1] * sizeof(double), dets,
                             0, NULL, NULL);

サイズを計算し、バッファからホストに結果を読み取る別のカーネルを実行せずに、プログラムのホスト部分に配列 (行列) の正確なサイズを知らせる方法はありますか?

4

2 に答える 2

1

あなたの問題に特化した回避策があるかもしれませんが、一般的には - いいえ。暗黙的に新しいサイズを見つけるか、明示的な値を読み戻します。

于 2012-12-11T11:06:28.167 に答える
0

保存されたデバイス メモリのサイズを変更することはできないと思いますが、その一部だけに書き込み、その部分をホストに読み戻すことはできます。

  • 最初の部分では、必要に応じて、カーネルに少し異なるマッピングを作成する必要があります。
  • clEnqueueReadBufferRect()2 番目の部分の関数を使用してみてください。
于 2016-01-23T15:12:05.393 に答える