求助 g++15.1使用std::execution对标准库算法加速遇到的问题 - 引入TBB头文件报错
已锁定
已解决
General Discussion | 综合讨论
-
参照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(仅学习了语言,非计算机专业)进行数值计算程序的开发工作,基础比较薄弱,如果大佬有解决方案,希望能稍微解释的详细些。
-
可以补充一下下面的信息:
- 系统和工具链版本(gcc/cmake...
- 报错的信息
- 把最小可复现示例工程放到github上的一个仓库里, 方便其他人获取调试
- 做过哪些尝试, 以及怀疑可能导致问题的原因
-
目前来看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; }
-
如果只是使用C++23, 不一定要使用import std/模块特性 (tbb目前本身没有支持/适配
-
S SPeak 将这个主题转为问答主题
-
S SPeak 将这个主题标记为已解决