跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • Online Tools
  • 用户
  • 群组
折叠
品牌标识

D2Learn Forums

  1. 主页
  2. General Discussion | 综合讨论
  3. 求助 g++15.1使用std::execution对标准库算法加速遇到的问题 - 引入TBB头文件报错

求助 g++15.1使用std::execution对标准库算法加速遇到的问题 - 引入TBB头文件报错

已定时 已固定 已锁定 已移动 已解决 General Discussion | 综合讨论
问题求助c++23g++15.1tbb
8 帖子 2 发布者 47 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • JFH-CAEJ 离线
    JFH-CAEJ 离线
    JFH-CAE
    编写于 最后由 SPeak 编辑
    #1

    参照std::for_each在GCC上和std::execution::par_unseq一起使用无法工作, 但在MSVC上可以工作 ,我按照提供的解决方案进行了尝试

    #CMakeLists.txt
    #指定编译器路径
    set(CMAKE_C_COMPILER gcc) 
    set(CMAKE_CXX_COMPILER g++)
    #设置C++标准
    set(CMAKE_CXX_SCAN_FOR_MODULES ON) ##使用模块
    ##使用std模块
    set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "d0edc3af-4c50-42ea-a356-e2862fe7a444")
    set(CMAKE_CXX_STANDARD 23)
    #设置项目名
    project(MyProject LANGUAGES CXX)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    set(CMAKE_CXX_EXTENSIONS OFF)
    # 启用调试符号
    set(CMAKE_BUILD_TYPE Debug)
    #设置编译器参数
    if(CMAKE_BUILD_TYPE MATCHES "Debug")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0")
    elseif(CMAKE_BUILD_TYPE MATCHES "Release")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
    endif()
    
    # 启用C++20模块支持
    if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fmodules")
    endif()
    
    find_package(TBB)
    set(CMAKE_CXX_MODULE_STD 1)
    add_executable(app src/main.cpp)
    
    #添加依赖关系
    target_link_libraries(app fft_module TBB::tbb)
    
    

    我的TBB版本为2021.11.0,执行如下代码

    //main.cpp
    import std;
    
    int main() {
        std::vector<int> foo;
        foo.reserve(1000);
        for (int i = 0; i < 1000; i++) {
            foo.push_back(i);
        }
    
        std::for_each(std::execution::par_unseq,
    									foo.begin(), foo.end(),
    										[](auto &&item) {
    										std::cout << item << std::endl;
    										std::random_device dev;
    										std::mt19937 rng(dev());
    										std::uniform_int_distribution<std::mt19937::result_type> dist6(10, 100);
    										std::this_thread::sleep_for(std::chrono::milliseconds(dist6(rng)));
    										std::cout << "Thread ID: " << std::this_thread::get_id() << std::endl;
    									});
    }	
    

    打印出的线程id都是一致的,但是当我在import std; 前加入#include<tbb/tbb.h>;时 编译器会给我报出一大段类型冲突的错误,我才刚刚尝试使用C++20(仅学习了语言,非计算机专业)进行数值计算程序的开发工作,基础比较薄弱,如果大佬有解决方案,希望能稍微解释的详细些。

    1 条回复 最后回复
    0
    • JFH-CAEJ 离线
      JFH-CAEJ 离线
      JFH-CAE
      编写于 最后由 编辑
      #2
      #include <iostream>
      #include <vector>
      #include <tbb/tbb.h>
      
      int main()
      {
      	std::vector<int> foo(1000);
      	tbb::parallel_for(0, 1000, [&](int i) {
      		foo[i] = i;
      		std::cout << i << std::endl;
      	});	
      }
      

      是可以正常工作的。

      1 条回复 最后回复
      0
      • SPeakS 离线
        SPeakS 离线
        SPeak d2learn-dev
        编写于 最后由 SPeak 编辑
        #3

        可以补充一下下面的信息:

        • 系统和工具链版本(gcc/cmake...
        • 报错的信息
        • 把最小可复现示例工程放到github上的一个仓库里, 方便其他人获取调试
        • 做过哪些尝试, 以及怀疑可能导致问题的原因
        1 条回复 最后回复
        0
        • JFH-CAEJ 离线
          JFH-CAEJ 离线
          JFH-CAE
          编写于 最后由 编辑
          #4

          谢谢回复,我已经将最小可复现示例工程放入公共仓库https://github.com/JFH-CAE/TBBtest,系统、工具链版本和错误信息已经放在readme中。

          JFH-CAEJ 1 条回复 最后回复
          0
          • JFH-CAEJ 离线
            JFH-CAEJ 离线
            JFH-CAE
            回复了JFH-CAE 最后由 编辑
            #5

            @JFH-CAE 在 求助 g++15.1使用std::execution对标准库算法加速遇到的问题 - 引入TBB头文件报错 中说:
            https://github.com/JFH-CAE/TBBtest

            1 条回复 最后回复
            0
            • SPeakS 离线
              SPeakS 离线
              SPeak d2learn-dev
              编写于 最后由 SPeak 编辑
              #6

              目前来看tbb应该还没对 c++ module进行适配
              tbb.h 和 import std在一个模块混用会报错

              如果非要使用 import std功能的话 需要自己做一个 中间层 wrapper tbb的一些接口 ( 所有涉及tbb的功能在这个wrapper里实现 其他地方import 这个 wrapper 来使用功能) 但是这里面可能有不少坑 要踩

              下面是一个最小示例

              tbb.cppm

              module;
              
              #include <tbb/tbb.h>
              #include <vector>
              #include <iostream>
              
              export module tbb;
              
              export namespace tbb {
                  void init_vec(std::vector<int>& vec) {
                      if (vec.empty()) return;
                      tbb::parallel_for(0, static_cast<int>(vec.size()), [&](int i) {
                          vec[i] = i;
                      });
                      std::cout << "Vector initialization complete." << std::endl;
                  }
              }
              

              main.cpp

              import std;
              import tbb;
              
              int main() {
                  std::vector<int> data(1000);
                  tbb::init_vec(data);
                  std::cout << "First 10 elements: ";
                  for (int i = 0; i < 10; ++i) {
                      std::cout << data[i] << " ";
                  }
                  return 0;
              }
              

              具体工程示例: https://github.com/Sunrisepeak/TBBtest

              1 条回复 最后回复
              0
              • SPeakS 离线
                SPeakS 离线
                SPeak d2learn-dev
                编写于 最后由 SPeak 编辑
                #7

                如果只是使用C++23, 不一定要使用import std/模块特性 (tbb目前本身没有支持/适配

                JFH-CAEJ 1 条回复 最后回复
                0
                • JFH-CAEJ 离线
                  JFH-CAEJ 离线
                  JFH-CAE
                  回复了SPeak 最后由 编辑
                  #8

                  @SPeak 在 求助 g++15.1使用std::execution对标准库算法加速遇到的问题 - 引入TBB头文件报错 中说:

                  如果只是使用C++23, 不一定要使用import std/模块特性 (tbb目前本身没有支持/适配

                  谢谢回复,我大概是明白了,看起来错误似乎来源于同时#include 标准库头文件,和import std; 而TBB库中会引入标准库的头文件。

                  1 条回复 最后回复
                  0
                  • ,SPeakS SPeak 将这个主题转为问答主题
                  • ,SPeakS SPeak 将这个主题标记为已解决

                  • 登录

                  • 没有帐号? 注册

                  • 登录或注册以进行搜索。
                  d2learn forums Powered by NodeBB
                  • 第一个帖子
                    最后一个帖子
                  0
                  • 版块
                  • 最新
                  • 标签
                  • 热门
                  • Online Tools
                  • 用户
                  • 群组