2

OpenCLを使用してデータの多くのチャンクを処理すると、7回目の反復でクラッシュします。
ループの各反復の前にメモリが解放され、新しいチャンクに再度割り当てられるようにしますが、Clenqueuewritebuffer()で-38のエラーが発生してクラッシュが発生します

私はたくさん試しましたが、どこにも行きません。

以下は私のコードの流れです:

    clGetPlatformIDs
    clGetDeviceIDs
    clCreateContext
    clCreateCommandQueue
    clCreateProgramWithSource
    clBuildProgram
    clCreateKernel

    for(x){
            clCreateBuffer
            clEnqueueWriteBuffer
            clSetKernelArg
            clEnqueueNDRangeKernel
            clFinish
            clEnqueueMapBuffer
            clReleaseMemObject
          }

それは正しいですか、それとも他の方法で使用する必要がありますか?
もしそうなら、私は何を間違っているのですか?...

4

1 に答える 1

1

このエラーが発生するコードと特定のコマンドがあれば便利です。

エラー-38はCL_INVALID_MEM_OBJECT すべてのメモリオブジェクトを正しく初期化したかどうかを確認してください。

使用しているものの出力を明示的に確認できますclCreateBuffer clCreateImage..か?このエラーは、カーネルに提供したバッファーが、タイプまたは読み取り/書き込み修飾子の点でパラメーター定義と一致しない場合にも発生する可能性があります。


編集した質問に一致するように編集します。

1)カーネルが実行されていないときにカーネル引数を変更できますが、カーネル引数を1回だけ設定することをお勧めします。(せいぜいclCreateKernelの直後)
割り当てられたバッファを再利用するのがさらに良いです。(または、同じバッファーの組み合わせを複数回使用する場合は、複数のカーネルを作成します)
あなたの場合、少なくともcreateBuffer and setKernelArgループの前とループのreleaseMemObject後に行います。

2)あなたはclEnqueueMapBufferあなたのmem-objectでやっています。clEnqueueUnmapMemObjectオブジェクトとの対話が完了したら、この後にaを付ける必要があります。バッファからデータを読み取りたいだけの場合は、次のことを試してくださいenqueueReadBufferenqueueWriteBuffer

于 2012-09-12T12:54:38.787 に答える