💪 图像算法工程师,专业从事且热爱图像处理,图像处理专栏更新如下👇:
📝《图像去噪》
📝《超分辨率重建》
📝《语义分割》
📝《风格迁移》
📝《目标检测》
📝《图像增强》
📝《模型优化》
📝《模型实战部署》
📝《图像配准融合》
📝《数据集》
📝《高效助手》
📝《C++》
📝《Qt》
目录
- 一、查看核心数和线程数
- 1.1 命令方式查看
- 1.2 代码查看
- 二、开启OpenMP多线程并行加速优化
- 2.1 安装MinGW
- 2.2 终端命令方式启用OpenMP多线程
- 2.2.1 自定义开启多线程数
- 2.2.2 启用多线程并行处理
- 2.2.3 开启自定义多线程实例代码
- 2.2.4 终端中启用多线程加速优化
- 2.2.4.1 打开终端
- 2.2.4.2 启用命令
- 2.3 Visual studio中开启OpenMP多线程
- 三、OpenMP多线程并行加速优化对比示例实验
- 3.1 对比讲解
- 3.2 代码
- 3.3 耗时输出
- 四、总结
一、查看核心数和线程数
1.1 命令方式查看
在终端输入下面命令查看自己windows电脑的核心数和线程数:
wmic cpu get NumberOfCores,NumberOfLogicalProcessors
终端中实际查看样例见下,我自己电脑的核心数为16,线程数为24。
1.2 代码查看
可编辑个.cpp脚本直接运行查看电脑的线程数,代码见下:
#include <omp.h>
#include <iostream>int main() {std::cout << "最大线程数: " << omp_get_max_threads() << std::endl;return 0;
}
运行上脚本输出见下:
二、开启OpenMP多线程并行加速优化
2.1 安装MinGW
windows电脑上开启OpenMP多线程并行加速优化需要先安装好MinGW,关于MinGW的详细安装教程见我另外一篇博文的第一大章节:MinGW详细安装教程
2.2 终端命令方式启用OpenMP多线程
2.2.1 自定义开启多线程数
自定义开启线程数的命令见下,示例命令开启12个线程:
omp_set_num_threads(12);
2.2.2 启用多线程并行处理
启用多线程并行处理命令见下:
#pragma omp parallel
2.2.3 开启自定义多线程实例代码
开启自定义多线程实例代码见下,存放在一个名为viewThreadCount.cpp脚本中:
#include <omp.h>
#include <iostream>
int main() {omp_set_num_threads(12);
#pragma omp parallel{
#pragma omp single{std::cout << "The number of threads used is: " << omp_get_num_threads() << std::endl;}}return 0;
}
2.2.4 终端中启用多线程加速优化
2.2.4.1 打开终端
先在终端中打开.cpp脚本所在路径,直接.cpp脚本路径中输入cmd再回车可直接打开终端,见下:
2.2.4.2 启用命令
在打开的终端中启用多线程加速优化命令见下:
g++ -O3 -fopenmp -march=native viewThreadCount.cpp -o viewThreadCount
参数解析:
• -O3:开启高级优化
• -fopenmp:启用 OpenMP
• -march=native:针对你当前 CPU 架构进行优化(SSE/AVX/FMA 等)
• viewThreadCount.cpp 待运行的.cpp脚本
• -o 运行输出的.exe文件名。
运行上面命令,会自动生成一个viewThreadCount.exe可执行程序,见下:
继续在终端中运行可执行程序viewThreadCount.exe,输出查看自己开启的线程数是否成功,见下:
2.3 Visual studio中开启OpenMP多线程
上面2.2中方法要通过终端输入命令的方式启用OpenMP多线程,本小节讲解在Visual studio中开启OpenMP多线程,直接在Visual studio中运行脚本即可开启多线程,方法见下:
下面执行代码验证多线程是否开启成功:
三、OpenMP多线程并行加速优化对比示例实验
3.1 对比讲解
为了直观的体现多线程加速优化效果和使用方法,下面举一个使用OpenMP 多线程并行加速对比示例实验,代码主要在for循环中做加法计算,见下:
对比代码见下:
3.2 代码
示例完整代码见下:
#include <iostream>
#include <vector>
#include <chrono>
#include <omp.h> // OpenMP 头文件using namespace std;
using namespace std::chrono;const int N = 100000000; // 1亿个元素int main() {omp_set_num_threads(2); // 自定义线程数vector<int> data(N, 1);long long sum = 0;// 非并行版本auto start_single = high_resolution_clock::now();sum = 0;for (int i = 0; i < N; ++i) {sum += data[i];}auto end_single = high_resolution_clock::now();auto time_single = duration_cast<milliseconds>(end_single - start_single).count();cout << "[单线程] 总和 = " << sum << ",耗时:" << time_single << " ms" << endl;// 并行版本auto start_multi = high_resolution_clock::now();sum = 0;
#pragma omp parallel for reduction(+:sum)for (int i = 0; i < N; ++i) {sum += data[i];}auto end_multi = high_resolution_clock::now();auto time_multi = duration_cast<milliseconds>(end_multi - start_multi).count();cout << "[多线程] 总和 = " << sum << ",耗时:" << time_multi << " ms" << endl;//cout << "OpenMP 设置的线程数: " << omp_get_max_threads() << endl;// 查看使用的线程数
#pragma omp parallel{
#pragma omp single{std::cout << "使用线程数: " << omp_get_num_threads() << std::endl;}}return 0;
}
3.3 耗时输出
为了体现不同线程的耗时区别,下面自定义不同的线程数测试,见下:
线程数设置为2,运行代码输出见下:
线程数设置为8,运行代码输出见下:
线程数设置为20,运行代码输出见下:
从上面的对比结果可以看出,使用OpenMP多线程并行加速优化,可以有效减少耗时。
四、总结
以上就是开启OpenMP多线程并行加速优化处理并查看电脑核心数和线程数的方法,并附上了使用方法和对比实验,希望能帮到你!
谢您阅读到最后!😊总结不易,多多支持呀🌹 点赞👍收藏⭐评论✍️,您的三连是我持续更新的动力💖
关注下面「视觉研坊」,获取干货教程、实战案例、技术解答、行业资讯!