Intel oneTBB Ubuntu Linux std::execution::par error



我在Ubuntu 20.04上使用oneTBB有问题。当我想使用std::execution::par与std::for_each同时使用CLI g++和cmake时,就会出现问题。我有gcc 9.4.0.

这是我遵循的程序:

  • 我已经安装了一个etbb使用英特尔GUI从英特尔的网页(这里)。

  • 我已经使用"源变量"设置了环境。在/tbb/latest/env中(在这里解释)。

  • 我有一个示例代码:

test.cpp:

#include <iostream>
#include <vector>
#include <algorithm>
#include <execution>
int main(){
std::vector<int> vec = {1, 2, 3, 4, 5, 10, 20, 4 };
std::sort(std::execution::seq, vec.begin(), vec.end()); // sequential
std::sort(std::execution::par, vec.begin(), vec.end()); // parallel
return 0;
}
  • 我尝试了以下命令:

    g++ -std=c++17 -o test test.cpp -ltbb
    

    这不起作用,并给出许多错误。

  • 我尝试了下面解释的命令行:

    g++ -o test test.cpp $(pkg-config --libs --cflags tbb)
    

    给出如下错误:

    error: ‘std::execution’ has not been declared
    

    指向std::sort lines。

  • 我尝试了以下(基于这里)cmake文件,没有运气:

    cmake_minimum_required(VERSION 3.22)
    project(test)
    set(CMAKE_CXX_STANDARD 20)
    list(APPEND CMAKE_MODULE_PATH "/home/username/oneapi/tbb/latest/lib/cmake/tbb")
    #set(CMAKE_MODULE_PATH "/home/username/oneapi/tbb/latest/lib/cmake/tbb") #this did not work either
    add_executable(test test.cpp)
    find_package(TBB REQUIRED)
    target_link_libraries(${PROJECT_NAME} tbb)
    
  • 有趣的是,这里给出的例子都有效。我可以构建和运行它们(除了MKL示例)。据我所知,这些例子中没有#include <execution>std::execution::par

  • 在其中一个oneTBB示例(例如fibonacci)中,如果我只将<execution>包含到示例源代码中,则不会给出上面第5和第6个选项的错误。但是当我想在代码中使用std::execution::par时,它无法编译。因此,当std::execution::par开始发挥作用时,示例不工作。

  • 旧版本的TBB,可以使用apt安装,没有这个错误。

任何帮助都是感激的。

本帖有详细说明

您在示例中使用了oneDPL api,因此它不是关于TBB本身。事实上,TBB只是oneDPL可以使用的后端之一——另一个是OpenMP。使用TBB后端,您可以了解到实际上来自与TBB后端错误使用相关的问题的错误——上面的一个响应描述了其中的一个方面。使用oneAPI,我们从旧的(并且与新api不兼容)"旧的"切换到"新的"。TBB——这也会影响到编译过程。建议将oneDPL头文件首先放入源代码中(例如,在标准库头文件之前)——这应该足以自动调用正确的TBB后端。

我们已经有关于oneDPL的文档,例如,请参阅

https://www.intel.com/content/www/us/en/develop/documentation/oneapi-dpcpp-library-guide/top.html

第一次看到错误的解决方案(由您找到的)。

最新更新