C++多线程并行计算

2024-06-16 22:08
文章标签 c++ 多线程 并行计算

本文主要是介绍C++多线程并行计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C++多线程并行计算

  • 多线程(std::thread)

多线程(std::thread)

写了一个简短的并行计算例子
存粹的利用CPU性能计算素数个数

//实现标准库头文件<numeric>中accumulate函数的并行版本
#include <iostream>
#include <thread>
#include <numeric>
#include <algorithm>
#include <vector>
#include <functional>
#include <utility>
#include <windows.h>using std::thread;
using std::vector;
using std::accumulate;
using std::cout;
using std::endl;// 被执行的函数
template <typename Iterator, typename T> class Accum
{
public:void operator() (Iterator first, Iterator last, T &sum){sum = 0;for (; first != last; ++first){// 简单的计算素数auto k = std::sqrtf(*first);int i = 0;for (i = 2; i <= k; i++){if ((*first)%i == 0){break;}}if (i > k){++sum;}}}
};// 分发任务的函数
template <typename Iterator, typename T>
T ParallelAccum(Iterator first, Iterator last, T &sum)
{//计算迭代器中包含的元素数量const unsigned int len = std::distance(first, last);//若迭代器中没有元素则直接返回if (!len){return sum;}//获取机器支持的并发线程数const unsigned int num_thread = thread::hardware_concurrency();//最终实际上每个线程处理的元素个数const unsigned int block_size = len / num_thread;//保存每个线程累加的结果vector<T> results(num_thread);//启动比num_thread - 1个线程,因为main函数本身已开启一个线程vector<thread> threads(num_thread - 1);//开始并行计算Iterator block_begin = first;for (unsigned int i = 0; i < (num_thread - 1); ++i){Iterator block_end = block_begin;//将迭代器向前推进一个块,到达当前块的末尾位置std::advance(block_end, block_size);//传递参数,通常情况下thread的构造函数将复制所提供的参数,需要将模板参数转为引用threads[i] = thread(Accum<Iterator, T>(), block_begin, block_end, std::ref(results[i]));block_begin = block_end;}//处理最后一个线程,由于block_size = len / num_thread得到的结果不一定为整数,该线程处理剩余的所有元素Accum<Iterator, T>()(block_begin, last, results[num_thread - 1]);//对threads中所有线程调用join()std::for_each(threads.begin(), threads.end(), std::mem_fn(&thread::join));//return accumulate(results.begin(), results.end(), sum);
}// 计时结构
LARGE_INTEGER t1, t2, tc;void time_begin()
{QueryPerformanceFrequency(&tc);QueryPerformanceCounter(&t1);
}float time_end()
{QueryPerformanceCounter(&t2);return ((t2.QuadPart - t1.QuadPart)*1.0 / tc.QuadPart) * 1000;
}int main()
{// 装备任务队列vector<int> i_vec;int sum = 0;for (int i = 1; i != 501000; ++i){i_vec.push_back(i);}// 并行计算示例time_begin();sum = ParallelAccum(i_vec.cbegin(), i_vec.cend(), sum);cout << "time: " << time_end() << ", sum = " << sum << endl;// 一般计算示例time_begin();Accum<vector<int>::iterator, int> a;a(i_vec.begin(), i_vec.end(), sum);cout << "time: " << time_end() << ", sum = " << sum << endl;return 0;
}

在这里插入图片描述

这篇关于C++多线程并行计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067677

相关文章

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元