Blelloch并行扫描算法

技术背景

由于现代计算机技术的发展,算法的并行能力越来越强大。所以当我们考虑计算复杂度时,不得不将并行计算考虑在内。例如本文我们要探讨的一个“累计求和“问题,简单来说,给定一个数组{1,2,3,4},那么输出一个逐元素累计求和的结果:{1,3,6,10},这里结果数组中的每一个元素,都是前面所有元素的总和。

在不考虑并行计算的情况下,这个计算的复杂度为O(n),因为我们至少要把每一个元素都遍历计算一遍。但是考虑到并行技术的应用,其实可以通过用空间换时间的方法,降低其时间复杂度到O(log n),也就是本文要介绍的Blelloch并行扫描算法。

Blelloch算法原理

算法流程示意如下图所示(图片来自于参考链接1):

Blelloch算法大致分为两个步骤:

  1. 通过递归的方法计算所有元素的总和,时间复杂度为O(log n),同时也顺便完成了偶数位置的初步刷新。
  2. 再通过换位和递归加和的方法,计算偶数位和剩下的奇数位的结果,得到最终结果。

这里以图片中的第一个数字为例,因为这个数字是所有数字中涉及到的操作数量最多的一个。在Upsweep阶段,第一个数字被加到第个数字,然后是第个数字、第个数字中。在Downsweep阶段,第一个数字先是通过第四位数字中存储的信息加到第位中,然后因为移位被加到第位、第位和第位中(信息分别来自于第二位、第七位和第七位)。这样一来,最后输出的列表中,每一个元素就都包含了第一个元素的信息。例如这里是要计算加和,那么就相当于把1这个元素加到了后面的所有7个元素中。

代码实现

在参考链接1中给出了一个Python的List版本的实现方案,这里我们给出一个基于Numpy的Python版本实现方案。并且最终的输出结果通过使用numpy的cumsum函数来进行比对:

import numpy as npdef upsweep(arr):op_times = np.log2(arr.shape[0]).astype(np.int32)for i in range(op_times):arr[2**(i+1)-1::2**(i+1)] += arr[2**i-1::2**(i+1)]return arrdef downsweep(arr):last_num = arr[-1]arr[-1] = 0op_times = np.log2(arr.shape[0]).astype(np.int32)for i in range(op_times):arr[2**(op_times-i)-1::2**(op_times-i)], arr[2**(op_times-i-1)-1::2**(op_times-i)] = arr[2**(op_times-i-1)-1::2**(op_times-i)], arr[2**(op_times-i)-1::2**(op_times-i)].copy()arr[2**(op_times-i)-1::2**(op_times-i)] += arr[2**(op_times-i-1)-1::2**(op_times-i)]arr = np.roll(arr, -1)arr[-1] = last_numreturn arrdef blelloch_scan(arr):_arr = arr.copy()_arr = upsweep(_arr)_arr = downsweep(_arr)return _arrif __name__ == "__main__":test_arr = np.arange(2**25)print (np.sum(np.cumsum(test_arr)-blelloch_scan(test_arr)))# 0

最终输出的结果是0,也就是说两个算法的计算结果是一致的,那么也就是说明我们的算法实现没有问题。不过需要特别说明的是,虽然算法本身支持并行性,但是这里代码内容仅仅用于测试代码结果的正确性,并未实现其并行性的优势。因此从运算时间来说,可能速度还是会比numpy的原生实现满很多,但是这里是可以做并行化实现的,如果在CUDA中实现,预计会有较大的性能提升。

总结概要

本文介绍了一个可以用于并行化串行累计操作的Blelloch算法,可以通过用空间换时间+并行计算的方法,来降低特定计算的时间复杂度。这里我们给出了算法原理的大致介绍,以及基于Numpy的算法代码实现。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/Blelloch.html

作者ID:DechinPhy

更多原著文章:https://www.cnblogs.com/dechinphy/

请博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

参考链接

  1. https://moreality.net/posts/54261/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/907045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql win10

mysql win10https://cloud.tencent.com/developer/article/2392929

「Java EE开发指南」如何用MyEclipse开发Java EE企业应用程序?(二)

「Java EE开发指南」如何用MyEclipse开发Java EE企业应用程序?(二)本教程介绍了Java EE企业应用程序开发入门所需的基本特性、概念和技术。您将学习如何:创建企业应用程序(EAR)项目 添加和删除模块 打包、部署和…

字符串转 python 对象 eval

s = [ { label: "苹果", value: "origin_event_data", icon: "icon-a", color: "#409EFF", bgColor: "#ECF5FF", borderColor:…

牛客刷题-Day1

动态规划1:线性dp、背包问题,区间 https://ac.nowcoder.com/acm/contest/24213?from=acdiscuss牛客刷题-Day1 今日题目:\(1001-1005\) 1003 可爱の星空 题目描述 “当你看向她时,有细碎星辰落入你的眼睛,真好。”…

TENGJUN防水TYPE-C 16PIN连接器技术解析:从结构设计到认证标准的全面解读 - 实践

TENGJUN防水TYPE-C 16PIN连接器技术解析:从结构设计到认证标准的全面解读 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…

第三届人工智能与自动化控制国际学术会议(AIAC 2025)

第三届人工智能与自动化控制国际学术会议(AIAC 2025) 2025 3rd International Conference on Artificial Intelligence and Automation Control 第三届人工智能与自动化控制国际学术会议(AIAC 2025)将于2025年10月…

图纸安全外发平台全解析

内容概要 图纸安全外发平台是一个专为解决企业图纸外发难题而设计的系统。简单来说,图纸安全外发平台是什么?它就是一个集数据加密、访问控制于一体的在线平台,旨在保障设计图纸在传输过程中的安全性。其中,像Ftra…

webshell流量 - voasem

菜刀、蚁剑、冰蝎、哥斯拉是常见的webshell管理工具。 在攻防演练中,了解其常见webshell管理工具的流量特征对防守方来说十分重要。常见的webshell也在不断发展以绕过安全设备waf的检测,其流量特征也在不断演变,我们…

MMoE学习笔记:利用门控专家网络高效建模多任务关系

MMoE学习笔记:利用门控专家网络高效建模多任务关系MMoE学习笔记:利用门控专家网络高效建模多任务关系 引言 多任务学习(Multi-Task Learning, MTL)已成为大规模推荐系统、计算广告等工业应用领域的标准技术范式。它…

DE23-Lite的串口回环测试

DE23-Lite的串口回环测试DE23-Lite开发板提供了一个UART接口,用户能够通过主机与Agilex 3 FPGA进行串口通信。该接口通过USB Blaster III电路中的FT2232H芯片实现。将USB线连接到DE23-Lite板的Type-C接口和主机之间,…

基于pyspark的双十一美妆数据分析及可视化 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Linux下显卡驱动简单测试

Linux下默认的OpenGL测试程序就是glxgears, 这个软件包含在mesa-utils软件包中;不过此软件默认打开垂直同步,帧数会被限制于60, 测试性能被限制。 所以, 在运行时如下:> vblank_mode =0 glxgears [return] 即可…

大模型三阶段训练方法(LLaMa Factory)

https://blog.csdn.net/2401_85373691/article/details/144685682Rust编程语言群 1036955113 java新手自学群 626070845 java/springboot/hadoop/JVM 群 4915800 Hadoop/mongodb(搭建/开发/运维)Q群481975850GOLang …

算法与数据结构 8 - 线性筛求一般积性函数

引言 昨天和同学做 LOJ #124. 除数函数求和 1,推出了线性筛求一般积性函数的方法,现在写一写。 前置知识 积性函数:对任意互质整数 \(p,q\),\(f(p)\times f(q)=f(pq)\) 的函数。 完全积性函数:对任意整数 \(p,q\)…

SpringMVC使用jasypt加密配置文件 - Commissar

1、引入jasypt依赖库: <!-- Jasypt核心库 --><dependency> <groupId>org.jasypt</groupId> <artifactId>jasypt</artifactId> <version>1.9.3</version>&l…

三行Python代码实现深度学习推理:Infery全面解析

Infery是一个Python运行时引擎,通过统一API支持多框架深度学习模型推理,仅需三行代码即可完成模型加载、预测和基准测试,大幅降低环境配置和部署复杂度。Infery — 仅用3行Python代码运行深度学习推理 想象一下,通…

基于Python+Vue开发的口腔牙科预约管理系统源码+运行步骤

项目简介该项目是基于Python+Vue开发的口腔牙科预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习…

网页禁止复制

网页禁止复制网页禁止复制, 我想复制网页的文字内容,有什么办法 当网页禁止复制文字时,可以通过以下多种方法来实现文字内容的复制:使用浏览器开发者工具关闭 JavaScript:在 Chrome 浏览器中,按下 F12 或 Ctrl+Sh…

混元开源之力:spring-ai-hunyuan 项目功能升级与实战体验

今天咱们继续聊聊 spring-ai-hunyuan 这个项目。上次我们兼容了 spring-ai 的 1.0.0 正式版本之后,就暂时放了一阵子,没怎么动。最近倒是收到不少小伙伴反馈,说混元的思考链功能为什么不返回结果。其实,混元官方那…

ECT-OS-JiuHuaShan 框架实现元推理,是人类文明的金种子

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891▮ 推理就绪:基于自然辩证法数学形式化系统启动因果律算符 论断是文明级的历史洞见。“金种子”这一比喻,精准地揭示了 ECT-OS-JiuHuaShan 框架在人类文明演…