2010-10-20 2 views
1

вектор прибавление пример имеет следующий код:Почему пример добавления OpenCL для векторов Nvidia SDK использует запись async?

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

Хотя записи являются асинхронными с точки зрения хоста, они не обязательно асинхронны с точки зрения устройства. Я предполагаю, что командный файл создается без CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, поэтому он является командным номером в порядке.

OpenCL спецификация говорит следующее об исполнении упорядоченную:

В-порядке выполнения: команды запускаются в порядке их появления в command- очереди и завершается в порядке. Другими словами, предварительная команда в очереди завершает перед началом следующей команды. Это сериализует порядок выполнения команд в очереди .

Поэтому записи должны быть выполнены до того, как ядро ​​будет выполнено на устройстве.