エラーメッセージ: すべての 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; 
}

関連情報