1

ベクトル加算の例には、次のコードがあります。

// Asynchronous write of data to GPU device
ciErr1 = clEnqueueWriteBuffer(cqCommandQueue, cmDevSrcA, CL_FALSE, 0, sizeof(cl_float) * szGlobalWorkSize, srcA, 0, NULL, NULL);
ciErr1 |= clEnqueueWriteBuffer(cqCommandQueue, cmDevSrcB, CL_FALSE, 0, sizeof(cl_float) * szGlobalWorkSize, srcB, 0, NULL, NULL);
shrLog("clEnqueueWriteBuffer (SrcA and SrcB)...\n"); 
if (ciErr1 != CL_SUCCESS)
{
    shrLog("Error in clEnqueueWriteBuffer, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
    Cleanup(EXIT_FAILURE);
}

// Launch kernel
ciErr1 = clEnqueueNDRangeKernel(cqCommandQueue, ckKernel, 1, NULL, &szGlobalWorkSize, &szLocalWorkSize, 0, NULL, NULL);
shrLog("clEnqueueNDRangeKernel (VectorAdd)...\n"); 
if (ciErr1 != CL_SUCCESS)

直後にカーネルを起動します。これはどのように問題を引き起こさないのですか?カーネルが正しく起動したときに、グラフィックメモリバッファが完全に書き込まれることを保証していませんか?

4

1 に答える 1

2

書き込みはホストの観点からは非同期ですが、デバイスの観点からは必ずしも非同期ではありません。コマンドキューはCL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLEなしで作成されると思いますので、順序どおりのコマンドキューです。

opencl仕様では、順序どおりの実行について次のように述べています。

順序どおりの実行:コマンドは、コマンドキューに表示された順序で起動され、順番に完了します。つまり、キューの前のコマンドは、次のコマンドが開始する前に完了します。これにより、キュー内のコマンドの実行順序がシリアル化されます。

したがって、カーネルがデバイスで実行される前に、書き込みが完了する必要があります。

于 2010-10-21T11:47:39.347 に答える