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

How to resolve “no member named 'task' in namespace 'tbb'” error when using oneDPL?

当我在我的代码中使用 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'

为什么会发生这种情况,我该如何解决?

当您使用 oneTBB because oneTBB is not compatible with legacy TBB 时会发生这种情况。

libstdc++9libstdc++10 使用 oneTBB 不支持的遗留 TBB 接口。 libstdc++11 已修复(参见 details)。

oneTBB release notes 说:

An application using Parallel STL algorithms in libstdc++ versions 9 and 10 may fail to compile due to incompatible interface changes between earlier versions of Threading Building Blocks (TBB) and oneAPI Threading Building Blocks (oneTBB). Disable support for Parallel STL algorithms by defining PSTL_USE_PARALLEL_POLICIES (in libstdc++ 9) or _GLIBCXX_USE_TBB_PAR_BACKEND (in libstdc++ 10) macro to zero before inclusion of the first standard header file in each translation unit.

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

如果headers的重新排序不适合你,你可以定义宏,例如:

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。