インテル® VTune™ プロファイラー・ユーザーガイド

エラーメッセージ: すべての OpenCL* API プロファイルでコールバックが受信されるわけではありません

原因

インテル® VTune™ プロファイラーは、OpenCL* API を使用して OpenCL* カーネルに関連するプロファイル情報を収集します。OpenCL* 仕様では、完了コールバックはスレッドセーフである必要があり、異なるスレッドから呼び出すことができます。収集の停止中に完了コールバックを受信する可能性があります。

解決方法

OpenCL* API を使用して、clEnqueue* 関数のイベント・コールバックを設定し、それらの受信を待機します。次に例を示します。

#include <atomic>
#include <thread>
...
#include <CL/cl2.hpp>

std::atomic_uint32_t number_of_uncompleted_callbacks = 0;

void CL_CALLBACK completion_callback(cl_event, cl_int , void*)
{
     --number_of_uncompleted_callbacks; 
}
int main()
{
    ...
    cl::Program prog(context, 
        std::string((std::istreambuf_iterator<char>(programSourceFile)),std::istreambuf_iterator<char>()));
    ...
    auto kernelFunc = cl::KernelFunctor<cl::Buffer, cl_int>(prog, "sin_cos"); 
    cl::Event event = kernelFunc(cl::EnqueueArgs(cl::NDRange(dataBuf.size())), clDataBuf, 0);

    ++ number_of_uncompleted_callbacks;
    event.setCallback(CL_COMPLETE, completion_callback);
    ...
    while (number_of_uncompleted_callbacks.load())
    {
        std::this_thread::yield();
    }
    return EXIT_SUCCESS;
}

関連情報