向量加法示例包含以下代码:
// 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)
之后它会启动内核。这怎么不会引起问题?当内核正确启动时,我们不能保证图形内存缓冲区已完全写入?
答案 0 :(得分:2)
虽然写入从主机的角度来看是异步的,但从设备的角度来看,它们并不一定是异步的。我假设命令队列是在没有CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE的情况下创建的,所以它是一个有序的命令队列。
opencl规范说明了有关有序执行的内容:
按顺序执行:命令按照它们在命令中出现的顺序启动 - 排队并按顺序完成。换句话说,队列上的先前命令完成 在以下命令开始之前。这序列化了命令的执行顺序 队列。
因此,在内核在设备上执行之前,写操作应该完成。