2012-04-13 2 views
1

Есть ли какой-нибудь пример использования clEnqueueNativeKernel в OpenCL? Таким образом, можно написать ядро ​​на языке c или C++. Остальные команды остаются неизменными?using clEnqueueNativeKernel в OpenCL

+0

Не могли бы вы указать цель, которую вы хотите достичь. Вопрос слишком общий прямо сейчас. – Kentzo

+0

Я хотел написать родное ядро ​​C++. Поэтому я должен использовать команду clEnqueueNativeKernel. Я искал источник, чтобы прочитать о достоинствах и недостатках родных ядер, а также о том, как их можно использовать. Кажется, они не поддерживаются на всех платформах. – Damoon

ответ

4

Native C++ «ядра» - это, по сути, просто функции, которые вы хотите выполнить в командной строке, чтобы сохранить порядок команд.

AFAIK они не поддерживаются на GPU. Если вы хотите выполнять функции C++ на всех устройствах, вам следует использовать обратные вызовы cl_event (когда status == CL_COMPLETE).

Предположим, у вас есть буферный объект, который вы хотите прочитать с устройства, и перейти к вашей функции C++. Кроме того, вы хотите, чтобы передать некоторое целое значение, а (я использую C++ OpenCL обертку):

// First of all, we should define a struct which describes our arguments list. 
struct Arguments 
{ 
    int integer; 
    void* buffer_host; 
}; 

// Define C/C++ function you want to call. 
void CFunction(void *args) 
{ 
    Arguments args = reinterpret_cast<Arguments*>(args); 
    // Do something with args->integer and args->buffer_host. 
} 

// ... 
Arguments args = {.integer = 0, .buffer_host = NULL}; 

// First, we should define Buffer objects in arguments. 
std::vector<cl::Memory> buffers_dev; 
buffers_dev.push_back(a_buffer); 

// Then we should define pointers to *pointer in args* which will be set 
// when OpenCL read data from buffers_dev to the host memory. 
std::vector<const void*> buffers_host; 
buffers_host.push_back(&args.buffer_host); 

// Finally, set integer 
args.integer = 10; 

queue.enqueueNativeKernel(CFunction, 
          std::make_pair(&args, siezof(Arguments)), 
          &buffers_dev, 
          &buffers_host); 

// At this point args were copied by OpenCL and you may reuse or delete it.