0

アクションによって OpenCL から取得

次のコードは、図に示されている目標を達成します。2 つのバッファー オブジェクトを作成し、clEnqueueCopyBuffer を使用してバッファー 1 の内容をバッファー 2 にコピーします。

次に、clEnqueueMapBuffer が Buffer 2 の内容をホスト メモリにマップし、memcpy がマップされたメモリを配列に転送します。

ここに画像の説明を入力

私の質問は、コードに次の行を記述しない場合、私のコードは引き続き機能しますか?

    err = clSetKernelArg(kernel, 0, sizeof(cl_mem),  
                 &buffer_one);                     
    err |= clSetKernelArg(kernel, 1, sizeof(cl_mem), 
                  &buffer_two);              
    queue = clCreateCommandQueue(context, device, 0, &err);
    err = clEnqueueTask(queue, kernel, 0, NULL, NULL);     

カーネルは空で、何もしていません。カーネル引数を設定し、タスクをキューに入れる必要は何ですか?

...
float data_one[100], data_two[100], result_array[100];
cl_mem buffer_one, buffer_two;
void* mapped_memory;
...

 buffer_one = clCreateBuffer(context,           
  CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR,             
  sizeof(data_one), data_one, &err);       
 buffer_two = clCreateBuffer(context,                  
  CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR,       
  sizeof(data_two), data_two, &err);  



  err = clSetKernelArg(kernel, 0, sizeof(cl_mem),  
                 &buffer_one);                     
  err |= clSetKernelArg(kernel, 1, sizeof(cl_mem), 
                  &buffer_two);              
 queue = clCreateCommandQueue(context, device, 0, &err);
 err = clEnqueueTask(queue, kernel, 0, NULL, NULL);     



 err = clEnqueueCopyBuffer(queue, buffer_one,  
  buffer_two, 0, 0, sizeof(data_one),           
  0, NULL, NULL);            



  mapped_memory = clEnqueueMapBuffer(queue, 
  buffer_two, CL_TRUE, CL_MAP_READ, 0,            
  sizeof(data_two), 0, NULL, NULL, &err);
  memcpy(result_array, mapped_memory, sizeof(data_two));       
  err = clEnqueueUnmapMemObject(queue, buffer_two, 
  mapped_memory, 0, NULL, NULL);                  
  }

...

4

1 に答える 1

0

enqueueTaskを呼び出すポイントは、データが実際にデバイスに常駐していることを確認することだと思います。フラグを使用するCL_MEM_COPY_HOST_PTRと、カーネルで必要になるまでメモリがホスト側に保持される可能性があります。したがって、タスクをエンキューすることで、メモリがデバイスに確実にもたらされます。これは一部のデバイスでも発生する可能性がありますが、他のデバイスでは発生しません。

タスクに引数がある場合とない場合の両方で、コードをインストルメント化し、タスクの実行にかかる時間を測定することで、この理論をテストできます。タスクが引数でかなり長くかかる場合、これが起こっている可能性があります。

于 2012-10-09T16:58:04.353 に答える