问题描述
/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'
为什么会发生这种情况,我该如何解决?
解决方法
当您使用 oneTBB 时会发生这种情况,因为 oneTBB 与 legacy TBB 不兼容。
libstdc++9
、libstdc++10
使用 oneTBB 不支持的旧版 TBB 接口。它已针对 libstdc++11
修复(请参阅 details)。
在 libstdc++ 版本 9 中使用并行 STL 算法的应用程序 和 10 可能由于不兼容的接口更改而无法编译 在早期版本的线程构建块 (TBB) 和 oneAPI 之间 线程构建块 (oneTBB)。禁用对并行 STL 的支持 通过定义 PSTL_USE_PARALLEL_POLICIES(在 libstdc++ 9 中)或 在每个翻译单元中包含第一个标准头文件之前,_GLIBCXX_USE_TBB_PAR_BACKEND(在 libstdc++ 10 中)宏为零。
如果您使用 oneDPL,则不必应用这些变通方法,因为 oneDPL 会为您完成此操作,但您需要在标准标题之前包含其标题。同时,您仍然可以像以前一样使用Parallel 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
如果它也不适用,请尝试使用旧版 TBB 而不是 oneTBB。