@SPeak 在 求助 g++15.1使用std::execution对标准库算法加速遇到的问题 - 引入TBB头文件报错 中说:
如果只是使用C++23, 不一定要使用import std/模块特性 (tbb目前本身没有支持/适配
谢谢回复,我大概是明白了,看起来错误似乎来源于同时#include 标准库头文件,和import std; 而TBB库中会引入标准库的头文件。
@SPeak 在 求助 g++15.1使用std::execution对标准库算法加速遇到的问题 - 引入TBB头文件报错 中说:
如果只是使用C++23, 不一定要使用import std/模块特性 (tbb目前本身没有支持/适配
谢谢回复,我大概是明白了,看起来错误似乎来源于同时#include 标准库头文件,和import std; 而TBB库中会引入标准库的头文件。
谢谢回复,我已经将最小可复现示例工程放入公共仓库https://github.com/JFH-CAE/TBBtest,系统、工具链版本和错误信息已经放在readme中。
#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;
});
}
是可以正常工作的。
参照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(仅学习了语言,非计算机专业)进行数值计算程序的开发工作,基础比较薄弱,如果大佬有解决方案,希望能稍微解释的详细些。