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

関連情報