インテル® 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;
}