【问题标题】:How to resolve “no member named 'task' in namespace 'tbb'” error when using oneDPL?使用oneDPL时如何解决“命名空间'tbb'中没有名为'task'的成员”错误?
【发布时间】: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


    【解决方案1】:

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

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

    oneTBB release notes说:

    在 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。

    【讨论】:

    • 实际上,您需要在任何其他头文件之前包含一个DPL头文件,因为标准库头文件也可能通过其他头文件引入。
    • 那个“dpcpp”是什么? :)
    • dpcpp 是数据并行 C++ 代码的编译器。通过以下链接查看详细信息:software.intel.com/content/www/us/en/develop/documentation/…
    猜你喜欢
    • 2021-03-04
    • 1970-01-01
    • 2013-06-09
    • 2022-01-12
    • 2021-09-16
    • 2017-02-13
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多