【发布时间】:2021-06-10 14:32:20
【问题描述】:
当我在代码中使用 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'
为什么会发生这种情况,我该如何解决?
【问题讨论】:
标签: 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'
为什么会发生这种情况,我该如何解决?
【问题讨论】:
标签: 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
如果它也不适用,请尝试使用 legacy TBB 而不是 oneTBB。
【讨论】: