为什么OpenCL矢量添加Nvidia SDK示例使用异步写入?

为什么OpenCL矢量添加Nvidia SDK示例使用异步写入?,sdk,vector,opencl,nvidia,addition,Sdk,Vector,Opencl,Nvidia,Addition,矢量加法示例包含以下代码: // 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_FA

矢量加法示例包含以下代码:

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

它随后立即启动内核。这怎么不引起问题呢?我们不能保证在内核启动时图形内存缓冲区已经完全写入,对吗?

虽然从主机的角度来看,写入是异步的,但从设备的角度来看,它们不一定是异步的。我假设commandqueue是在没有CL_QUEUE_OUT_OF ORDER_EXEC_MODE_ENABLE的情况下创建的,因此它是一个有序commandqueue

opencl规范对订单执行做了如下说明:

按顺序执行:按命令中出现的顺序启动命令- 排队并按顺序完成。换句话说,队列上的前一个命令完成 在以下命令开始之前。这将序列化中命令的执行顺序 排队

因此,写入应该在内核在设备上执行之前完成