首页 > 其他分享 >并行版的 std::accumulate

并行版的 std::accumulate

时间:2023-07-19 09:04:28浏览次数:25  
标签:std 并行 long num threads accumulate block

#include <iostream>
#include <numeric>
#include <thread>
#include <vector>

template <typename Iterator, typename T> struct accumulate_block {
    void operator()(Iterator first, Iterator last, T& result) { result = std::accumulate(first, last, result); }
};

template <typename Iterator, typename T> T parallel_accumulate(Iterator first, Iterator last, T init)
{
    unsigned long const length = std::distance(first, last);
    if(!length) {
        return init;
    }

    unsigned long const min_per_thread = 25;
    unsigned long const max_threads = (length + min_per_thread - 1) / min_per_thread;

    unsigned long const hardware_threads = std::thread::hardware_concurrency();

    unsigned long const num_threads = std::min(hardware_threads != 0 ? hardware_threads : 2, max_threads);

    // 每个线程计算的数量
    unsigned long long block_size = length / num_threads;

    // 用于存储每个线程的计算结果
    std::vector<T> results(num_threads);

    // 因为在启动之前已经有了一个线程(执行此方法的线程),所以启动的线程数必须比num_threads少1。
    std::vector<std::thread> threads(num_threads - 1);

    Iterator block_start = first;
    for(unsigned long i = 0; i < (num_threads - 1); ++i) {
        Iterator block_end = block_start;
        // 将迭代器向后移动
        std::advance(block_end, block_size);
        // 开启线程计算结果
        threads[i] = std::thread(accumulate_block<Iterator, T>(), block_start, block_end, std::ref(results[i]));

        block_start = block_end;
    }

    accumulate_block<Iterator, T>()(block_start, last, results[num_threads - 1]);

    for(auto& entry : threads) {
        entry.join();
    }

    // 合并计算结果并返回
    return std::accumulate(results.begin(), results.end(), init);
}

int main()
{
    std::vector vec(100000, 1);
    int init{ 0 };
    std::cout << parallel_accumulate(vec.begin(), vec.end(), init) << std::endl;
    return 0;
}

标签:std,并行,long,num,threads,accumulate,block
From: https://www.cnblogs.com/gcvition/p/17564645.html

相关文章

  • C++并行程序设计
    什么是并发?两个或两个以上事件或活动在同一时刻发生。如多个任务在多个CPU或CPU的多个核上同时执行,不存在CPU资源的竞争、等待行为并发程序的意义何在?充分发掘多核处理器的性能,提高计算速率仅供初次学习此内容创作,如有不对请大佬指正前置并行计算基础理论背景......
  • lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /home/liuj
     glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于glibc囊括了几乎所有的 UNIX 通行的标准,可以想见其内容包罗万象。而......
  • std::bitset
    std::bitset前言感觉ZGY讲得不是很清楚(例题讲得有点少,而且感觉有一点乱),所以来写了这一篇文章。但是最好结合着他的文章一起学习。可能有错别字错公式错表达大佬们请请多包涵Orz。点赞投币收藏(三连键)。std::bitset其实在很多情况下都可以使用,这个容器因为利用状态压......
  • Oracle学习笔记:parallel并行处理 --转载 https://blog.csdn.net/w892824196/article/
    在使用oracel查询时,可以通过并行提高查询速度。例如:select/*+parallel(a,6)*/count(1)fromtable_namea;强行启用并行度来执行当前SQL。加上这个说明之后,可以强行启用Oracle的多线程处理功能,提高效率。但本身启动这个功能,也是要消耗资源与性能的。所有,一般都会在返回记......
  • 传奇数据库教学-传奇MagicDb、MonsterDb、StditemDb数据库说明
    MagicDb:是你所修炼的法术和各种技能.(1)magsid物品代号(2)magname物品名称(3)effecttype效果属性(4)effect效果(放此魔法所产生的动画效果)(5)spell每次耗用魔法值(6)defspell升级后增加的每次耗用魔法值(7)defpower升级后增加的威力(8)defmaxpower升级后增加的最大(9)job......
  • gcc5 std::string的变化
    自从GCC-5.1开始,std::string引入了遵从C++11标准的新实现,默认使用SSO(smallstringoptimization)特性,禁用了写时复制(COW)引用计数机制,这也带来了与旧版本std::string的ABI兼容性问题。 参考:http://www.pandademo.com/2017/04/new-changes-of-gcc5-std-string/https......
  • nginx: [emerg] unknown directive "ngx_fastdfs_module" in /usr/local/src/nginx-1.
    一、问题说明:搭建fastDFS集群时,提示错误信息为:nginx:[emerg]unknowndirective"ngx_fastdfs_module"in/usr/local/src/nginx-1.10.0/conf/nginx.conf:52        通过分析加载fastdfs模块出错二、配置完信息后在,执行nginx-V  发现没有fastdfs的相关内......
  • C++面试八股文:知道std::unordered_set/std::unordered_map吗?
    C++面试八股文:知道std::unordered_set/std::unordered_map吗?某日二师兄参加XXX科技公司的C++工程师开发岗位第27面:面试官:知道std::unordered_set/std::unordered_map吗?二师兄:知道。两者都是C++11引入的新容器,和std::set和std::map功能类似,key唯一,unordered_map的value可变。......
  • 关于并行开发的一些概念整理
    〇、前言想很好的理解并行开发,需要了解的知识还是有很多的,下边就简单罗列几个概念。一、相关概念简介1、任务管理器中的基准速度、插槽、内核、逻辑处理器基准速度  就是处理器晶体管打开和关闭的速率,也就是CPU运作的参考速度。听起来像是速度越快越好,但是也有一定的局......
  • 动态数组和C++ std::vector详解
    目录1.std::vector2.vector的用法    2.1vector的定义和声明    2.2成员函数        2.2.1基本函数            operator=            assign            get_allocator        2.2.2元素访问   ......