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

原因

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

解決方法

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; 
    }

関連情報