2016-04-11 4 views
0

OpenCLでは完全に緑色です。私はインテルのウェブサイトでサンプルを入手しようとしていますが、できません。 This is the sampleCLSetKernelArgがCL_INVALID_MEM_OBJECTを返します。

ので、同じようclSetKernelArgに整数の引数を渡そうとしたとき、私は、エラーCL_INVALID_MEM_OBJECTを取得しています:

err = clSetKernelArg(ocl->kernel, 2, sizeof(cl_mem), (void *)&width); 
if (CL_SUCCESS != err) 
{ 
    LogError("Error: Failed to set argument dstMem, returned %s\n", TranslateOpenCLError(err)); 
    return err; 
} 

チュートリアルは、画像上で動作するようになって、特に引数のような設定されるべきであると述べています:ここでは

err |= clSetKernelArg(ocl->kernel, 2, sizeof(cl_mem), (void *) &width); 
err |= clSetKernelArg(ocl->kernel, 3, sizeof(cl_mem), (void *) &height); 

は、フル機能である:

cl_uint SetKernelArguments(ocl_args_d_t *ocl, cl_uint width, cl_uint height) 
{ 
    cl_int err = CL_SUCCESS; 

    err = clSetKernelArg(ocl->kernel, 0, sizeof(cl_mem), (void *)&ocl->srcA); 
    if (CL_SUCCESS != err) 
    { 
     LogError("error: Failed to set argument srcA, returned %s\n", TranslateOpenCLError(err)); 
     return err; 
    } 

    err = clSetKernelArg(ocl->kernel, 1, sizeof(cl_mem), (void *)&ocl->dstMem); 
    if (CL_SUCCESS != err) 
    { 
     LogError("Error: Failed to set argument dstMem, returned %s\n", TranslateOpenCLError(err)); 
     return err; 
    } 

    err = clSetKernelArg(ocl->kernel, 2, sizeof(cl_uint), (void *)&width); 
    if (CL_SUCCESS != err) 
    { 
     LogError("Error: Failed to set argument dstMem, returned %s\n", TranslateOpenCLError(err)); 
     return err; 
    } 

    err = clSetKernelArg(ocl->kernel, 3, sizeof(cl_mem), (void *)&height); 
    if (CL_SUCCESS != err) 
    { 
     LogError("Error: Failed to set argument dstMem, returned %s\n", TranslateOpenCLError(err)); 
     return err; 
    } 

    return err; 
} 

最後の注記:clSetKernelArgのサイズをsizeof(cl_uint)に変更すると、エラーがCL_INVALID_ARG_SIZEに変更されます。

これでは不十分な場合は、ソースをgithub hereに公開しています。

私はチュートリアルの指示によく従っていましたが、私が逃したかもしれないものを理解することはできません。御時間ありがとうございます。

+0

あなたはカーネル関数の引数は、このような* __global intとして喜ば書くことができます... –

答えて

1

githubでコードをすばやく調べたところ、いくつかのアドバイスをいただけると思います。あなたは

cl_mem cl_width = clCreateBuffer(context,CL_MEM_READ_WRITE|CL_MEM_COPY_HOST_PTR, sizeof(width), &width,*err); err = clSetKernelArg(ocl->kernel, 2, sizeof(cl_mem), &cl_width);

呼び出す前に

まず、あなたが「cl_mem」型のメモリオブジェクトを使用する前に、「clCreateBuffer」と呼んで、他の言葉で、私は「幅」「cl_mem」の種類があることを確認してくださいそれがうまくいくかどうかは分かりません。

第2に、私の経験によれば、 "int"や "char"などの値を渡すために "cl_mem"を使用することは控えめです。私があなただったら、私は「clCreateBuffer」節を省略し、次のようなコードを記述します:

cl_int width = doSomeThingYouWant(); 

err = clSetKernelArg(ocl->kernel, 2, sizeof(cl_uint), &width);

それが役立つことができる願っています。

1

質問に簡単にお答えします。我々はclSetKernelArg関数の定義を見てみた場合

:あなたがclSetKernelArgに渡す必要があるもの

cl_int clSetKernelArg (cl_kernel kernel, 
    cl_uint arg_index, 
    size_t arg_size, 
    const void *arg_value) 

あなたが見ることができますが、あなたの引数へのポインタ、および引数のサイズです。さて、あなたの引数は普通のcl_uint変数です。そこで、私たちは以下のことができます:だから

const void *arg_value -> &width 
size_t arg_size -> sizeof(width) 

を、あなたのAPIの呼び出しは、次のようになります:

err |= clSetKernelArg(ocl->kernel, 2, sizeof(width), (void *) &width); 
err |= clSetKernelArg(ocl->kernel, 3, sizeof(height), (void *) &height); 
関連する問題