2010-10-20 42 views
1

,矢量的例子有這樣的代碼:爲什麼OpenCL向量添加Nvidia SDK示例使用異步寫入?

// 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) 

它啓動的內核權之後。這不會造成問題?當內核啓動正確時,我們不保證圖形內存緩衝區已經被完全寫入?

回答

2

雖然從主機的角度來看寫操作是異步的,但從設備角度來看,它們不一定是異步的。我假設commandqueue創建時沒有CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE,所以它是一個有序的命令隊列。

OpenCL規範說以下有關順序執行:

順序執行:命令在它們出現在命令 - 隊列的順序啓動,併爲了完成。換句話說,在下列命令開始之前,隊列上的先前命令完成 。這將在 隊列中序列化命令的執行順序。

因此,在內核在設備上執行之前應該完成寫操作。