Почему в примере с добавлением вектора OpenCL Nvidia SDK используется асинхронная запись? - PullRequest
1 голос
/ 20 октября 2010

Пример сложения векторов имеет следующий код:

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

Он запускает ядро ​​сразу после этого. Как это не вызывает проблем? Мы не гарантируем, что буферы графической памяти были полностью записаны при запуске ядра, верно?

1 Ответ

2 голосов
/ 21 октября 2010

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

В спецификации opencl о выполнении по порядку говорится следующее:

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

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

...