使用 oneDPL 时如何解决“命名空间 'tbb' 中没有名为 'task' 的成员”错误?

Dmi*_*lev 5 tbb

当我在代码中使用 oneDPL 时,我面临以下问题:

/usr/lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/pstl/parallel_backend_tbb.h:70:10: error: no member named 'task' in namespace 'tbb'
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况以及如何解决它?

小智 5

当您使用oneTBB时会发生这种情况,因为 oneTBB 与旧版 TBB不兼容。

libstdc++9libstdc++10使用 oneTBB 不支持的传统 TBB 接口。它已修复libstdc++11(请参阅详细信息)。

oneTBB 发行说明中写道:

由于早期版本的线程构建块 (TBB) 和 oneAPI 线程构建块 (oneTBB) 之间的接口更改不兼容,在 libstdc++ 版本 9 和 10 中使用并行 STL 算法的应用程序可能无法编译。在每个翻译单元中包含第一个标准头文件之前,通过将 PSTL_USE_PARALLEL_POLICIES(在 libstdc++ 9 中)或 _GLIBCXX_USE_TBB_PAR_BACKEND(在 libstdc++ 10 中)宏定义为零来禁用对并行 STL 算法的支持。

如果您使用 oneDPL,则不必应用这些解决方法,因为 oneDPL 会为您完成此操作,但您需要在标准标头之前包含其标头。同时,您仍然可以像以前一样使用并行 STL 算法,因为 oneDPL 实现了它们。

如果标题的重新排序不适合您,您可以定义宏,例如:

dpcpp my_app.cpp -DPSTL_USE_PARALLEL_POLICIES=0 # for libstdc++ 9
dpcpp my_app.cpp -D_GLIBCXX_USE_TBB_PAR_BACKEND=0 # for libstdc++ 10
Run Code Online (Sandbox Code Playgroud)

如果它也不适用,请尝试使用旧版 TBB 而不是 oneTBB。