1

OpenCL で clEnqueueNativeKernel を使用する例はありますか? このようにして、ac または c++ 言語でカーネルを作成できます。他のコマンドは変更されませんか?

4

1 に答える 1

4

ネイティブ C++ の「カーネル」は、基本的に、コマンドの順序を維持するためにコマンド キュー内で実行する関数にすぎません。

私の知る限り、それらは 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.
于 2012-04-23T10:53:49.907 に答える