我正在尝试使用 OMPT 来跟踪基于任务的应用程序。
这些是我用来编译 LLVM OpenMP 运行时的编译选项:
cmake ../openmp -G "Unix Makefiles" -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Release -DOPENMP_ENABLE_LIBOMPTARGET=OFF -DLIBOMP_OMPT_OPTIONAL=ON
我正在使用 Clang 13 和官方 github 存储库中的最新 LLVM OpenMP 运行时。
我的应用程序由多个使用
#pragma omp task depend (inout:some_vector[0:some_limit])
的嵌套任务组成
我注册了几个 OMPT 回调,包括
ompt_callback_task_create
、ompt_callback_dependences
、ompt_callback_task_schedule
,它们运行正常,并给了我想要的反馈。
但是,某些回调未运行:
ompt_callback_task_dependence
(虽然任务之间存在依赖关系...)和ompt_callback_work
,即使它们注册到ompt_set_callback
返回与ompt_set_always
对应的代码5。
我应该怎么做才能让这些回调起作用?我在这里错过了什么吗?我也尝试使用不同的运行时/编译器,但没有任何结果。
任何帮助将不胜感激。
如果前驱在后继创建之前完成,则可能不会引发
ompt_callback_task_dependence
事件。生产者线程创建“A”并休眠 1 秒。
同时,另一个线程消耗“A”并完成它。
然后,1秒。随后,生产者线程醒来并创建“B”。
既然‘A’完成了,就没有必要依赖它来制作‘B’了。
# pragma omp task depend(out: x) // A
{}
sleep(1);
# pragma omp task depend(in: x) // B
{}