并行计算:循环程序并行化的一般方法

article/2025/9/13 14:45:37

一、数据划分和处理器指派

1. 带状划分方法

    又叫做行列划分,就是将矩阵的整行或整列分成若干组,各组指派给一个处理器。

    例如:设矩阵A由n行和m列,对其串行处理的程序段如下:

for i=1 to n dofor j=1 to m doProcess(a[i,j])endfor
endfor

    其中Process(a[i,j])表示对矩阵元素a[i,j]某种处理过程。

(1)行划分   

    现在有p个处理器,可以并行的去处理。那么在行划分的情况下,每个处理器需要处理r=n/p行(假设能够整除),那么程序的实际运行是下面这样的:

for k=1 to p parallel-dofor i=1 to r dofor j=1 to m doProcess(a[(k-1)r+i,j])endforendfor
endfor

假设四个处理器处理16x16的矩阵,那么分配情况如下 

处理器
10,1,2,3
24,5,6,7
38,9,10,11
412,13,14,15

 

(2)列划分

    现在有p个处理器,可以并行的去处理。那么在列划分的情况下,每个处理器需要处理s=m/p行(假设能够整除),那么程序的实际运行是下面这样的:

for k=1 to p parallel-dofor j=1 to s dofor i=1 to n doProcess(a[i,(k-1)s+j])endforendfor
endfor
处理器
10,1,2,3
24,5,6,7
38,9,10,11
412,13,14,15

 

(3)行循环划分

    行循环划分跟划分的区别在于行划分一块一块地划分,而行循环划分是循环地划分。在行划分地情况下第一个处理器可能分到的是0,1,2,3行,而在行循环划分则是0,4,8,12(假设有四个处理器)

for k=1 to p parallel-dofor i=1 to r dofor j=1 to m doProcess(a[(i-1)p + k, j])endforendfor
endfor
处理器
10,4,8,12
21,5,9,13
32,6,10,14
43,7,11,15

 

(4) 列循环划分

for k=1 to p parallel-dofor i=1 to n dofor j=1 to s doProcess(a[i, (j-1)p+k])endforendfor
endfor
处理器
10,4,8,12
21,5,9,13
32,6,10,14
43,7,11,15

2. 块状划分方法

     如使用棋盘划分的方法。

 3.数据划分准则

(1) 并行粒度准则

    如果某一项给定的任务在其完成后要求同步时的最坏事件复杂度为t(n), 那么最大可能加速比是O\sqrt {t(n)}

    如复杂度为n^3, 则最大可能加速比为n^1.5, 所以我们最求并行粒度更大一些,以最求更大的加速比。

(2)数据相关性准则

    划分应该减少处理器之间的通信,即处理器之间的数据相关性越弱越好。

二、循环重构

1.循环交换

    即行循环和列循环交换。如果行与行之间存在数据依赖(称为行相关),或者列与列之间有数据依赖(列相关),可以通过循环交换来实现并行化。

for i=1 to n dofor j=1 to n doa[i,j]=a[i-1,j]endfor
endfor

    可以转化为

for j=1 to n parallel-dofor i=1 to n doa[i,j] = a[i-1,j]endfor
endfor

2.拉伸法

    如果既有行相关,又有列相关,那么可以通过拉伸来解决数据依赖,并实现并行化。

for i=1 to n dofor j=1 to n doa[i,j] = a[i-1,j]+a[i,j-1]endfor
endfor

拉伸之后,拉伸系数为1 

for i=1 to n dofor j=i+1 to i+n doa[i,j-i]=a[i-1,j-i]+a[i,j-i-1]endfor
endfor

 这样,我们可以进行列的并行化,为了适应实际需要(数据范围的变化),上面的程序应该修改为。

for j=2 to 2n dofor i=max(1,j-n) to min(n, j+1) parallel-doa[i,j-i] = a[i-1,j-i] + a[i,j-i-1]endfor
endfor

    这里只能内层做并行化,因为问题本身既有行相关又有列相关,拉伸后消除了行相关,从而能对其中一层进行并行化。虽然并行粒度较小,但比原来不能进行并行化的情况要快。

   这里再举一个例子。

    设A为n阶矩阵,有串行程序如下:

for i=1 to n dofor j=1+i to n+i doa[i,j] = (a[i,j+1]+a[i,j-1]+a[i+1,j]+a[i-1,j])/4endfor
endfor

      所以我们可以构造并行程序如下所示

for j=2 to 2n do for i=max(1,j-n) to min(n,j-1) parallel-doa[i,j-i] = (a[i,j+1-i]+a[i,j-1-i]+a[i+1,j-i]+a[i-1,j-i])/4endfor
endfor

   这里不在计算范围的数据如a[0]设为0。这里主要的技巧即使坐标的转换,当我们进行斜向计算的时候,可以放下,每一个数据它们的横纵坐标x,y是符合x+y=2....2n的,所以得出a[i,j-i]。

3.分裂法

    分裂法是一种通过将循环迭代空间细分称相同形状和大小的数据块以达到局部化相关关系的变换方法。变换之后,一个子数据块内部的全部迭代被同一个处理器执行,只有在子数据块之间计算才需要通信。

    这里,我们通过分裂法,把n阶矩阵分成了大小为ss*ss的小矩阵块进行并行计算,只有当C的计算需要进行块与块之间通信时才会进行通信。 

4.轮转法    

   轮转法的做法与拉伸法很类似,对循环j和循环i进行拉伸,拉伸系数为i。但是它的处理顺序和拉伸法不同。

//重构前
for i=0 to n-1 dofor j=0 to m-1 doProcess(a[i,j])endfor
endfor//重构之后
for i=0 to n-1 dofor j=0 to m-1 parallel-doProcess(a[i,(j+i)mod m])endfor
endfor

5. 并列法

    并列法将循环体中无相关关系的部分拆分称几个并列的循环,使这几个循环之间可以互相并行执行。如下所示:

for i=1 to n dofor j=1 to n doS1;S2;...;Smendfor
endfor

    这时我们可以对S1,S2进行拆分

for k=1 to m parallel-dofor i=1 to n dofor j=1 to n doSkendforendfor
endfor

     这样子划分的话,它的加速比可以提升更大,如果在原基础上进行行的并行化或者列的并行化,可能还会存在数据依赖的问题,且加速比不够大。


http://chatgpt.dhexx.cn/article/2p8Ey76x.shtml

相关文章

并行计算之MPI(三)

了解MPI 什么是MPI (1)MPI是一个库而不是一门语言,许多人认为MPI就是一种并行语言,这是不准确的。但是按照并行语言的分类可以把FORTRANMPI或CMPI。看作是一种在原来串行语言基础之上扩展后得到的并行语言,MPI库可以被…

并行计算的一些思考与总结

弗林分类法 根据弗林分类法,计算机结构主要分为 SIMD----单指令、多数据MIMD---多指令、多数据SISD----单指令、单数据MISD---多指令、单数据 一般的串行程序中为SISD,即在单核CPU下任何时间和地点只有一个指令处理一个数据,其所谓的多线程…

并行计算之MPI(二)

1.并行编程模型 目前两种最重要的并行编程模型是数据并行和消息传递数据并行编程模型的编程级别比较高编程相对简单但它仅适用于数据并行问题消息传递编程模型的编程级别相对较低但消息传递编程模型可以有更广泛的应用范围。 数据并行即将相同的操作同时作用于不同的数据因此…

Matlab 并行

Matlab 并行 1. 检查是否有并行附加功能2. 创建和删除并行2.1 创建默认的并行池2.2 在本地创建2.3 在集群创建2.4 删除 3. Parallel pool 包含的一些函数3.1 parfor3.2 parfeval 初学,肯定有理解不够的地方。看官方文件更靠谱。 1. 检查是否有并行附加功能 如果没有…

并行处理及分布式系统期末总结笔记

并行处理及分布式系统期末总结笔记 1、任务并行、数据并行的应用2、冯诺依曼体系结构的瓶颈及改进,Flynn分类法涉及的几种模型及其特点3、Cache的特点,Cache缺失、Cache命中、Cache一致性及解决方法、伪共享、流水线、多发射4、加速比、效率、阿姆达尔定…

并行程序设计导论期末复习

任务并行、数据并行的应用 任务并行 将待解决问题所需要执行的各个任务分配到各个核上执行。 数据并行 将待解决问题所需要处理的数据分配给各个核,每个核在分配到的数据集上执行大致相似的操作。 冯诺依曼体系结构的瓶颈及改进,Flynn分类法涉及的几…

并行程序设计导论 概念总结

Parallel Programing caiyi 2021/6/17 第一章 1.为什么要构建并行系统? 电路晶体管密度过大会使处理器能耗增加,散热的问题使通过继续增快集成电路密度提高处理器性能不再现实,因此集成电路商决定构建多核处理器。 2.为什么要编写并行程序&#xf…

cuda 并行计算

1 简介 2006年,NVIDIA公司发布了CUDA,CUDA是建立在NVIDIA的GPU上的一个通用并行计算平台和编程模型,基于CUDA编程可以利用GPU的并行计算引擎来更加高效地解决比较复杂的计算难题。CUDA是NVIDIA公司所开发的GPU编程模型,它提供了GP…

数据 并行

first 含义是计算机内包含一组处理单元(PE),每一个处理单元存储一个(或多个)数据元素。当机器执行顺序程序时,可对应于全部或部分的内部处理单元所存的数据同时操作。 将并行处理技术引入信息检索领域 把数…

并行的常见问题和注意事项

关于Oracle中的并行,可以说是一把双刃剑,用得好,可以充分利用系统资源,提升数据库的处理能力,用得不好,可能会适得其反。 并行的基本使用方法,对于大部分SQL开发者和DBA来说,并行的一…

并发和串行、并行的概念

先抛开语言不管,只聊概念,说起并发,就很容易想到它和串行、并行的区别。 串行:一次只能取得一个任务并执行这个任务,这个任务执行完后面的任务才能继续; 并发:指的是在同一个时间段内&#xf…

牛腩新闻发布--过程或函数 'news_selectByCaId' 需要参数 '@caid',但未提供该参数(二)

发现问题 之前有一篇博客是因为存储过程中没有添加相应的函数,导致出现了“过程或函数 ‘news_selectByCaId’ 需要参数 ‘caid’,但未提供该参数”,这次继续出现了这样一个问题,但是出现的错误就不再过程函数中了,而…

牛腩新闻发布--过程或函数 'news_selectByCaId' 需要参数 '@caid',但未提供该参数(三)

发现问题 这篇博客是建立在“牛腩新闻发布–过程或函数 ‘news_selectByCaId’ 需要参数 ‘caid’,但未提供该参数(二)”,因为在那篇博客中说出了我当时遇到的“过程或函数 ‘news_selectByCaId’ 需要参数 ‘caid’,…

【牛腩】-'T_news_selectByCaId' 需要参数 '@caid',但未提供该参数。”

问题截图 解决方案: 改动存储过程 BEGINselect n.id,n.title,n.createTime,c.[name],n.caId from T_news ninner join T_category c on n.caIdc.id and n.caIdcaidorder by n.createTime desc END检查传参是或否正确如果以上都没有错误,那就看一下是否…

【重要补充】关于第三方潜在SDK导致的5.1.2Data use sharing

接上一篇《关于IDFA、CAID和「5. 1.2 - Data use & sharing」》后,我们发现,苹果在14.5出来前,对于IDFA替代方案之数据收集的审核打击力度越来越大。 因5.1.2条款被拒,目前可以确认的原因有以下两大: 一、如果你…

spring笔记⑬——spring事务

事务的四个特征 CAID是事务的四个特征,所有事务都必须满足以下特性。 原子性(Atomicity):一个事务要么全部执行,要么不执行一致性(Consistency):事务的运行并不改变数据库中数据的一致性隔离性&#xff0…

SQL查询语句(内联,as,in,通配符)

最近在学习牛腩新闻发布系统,正如牛老师所说,作为一个优秀的.NET开发人员,对SQL语句不熟怎么能行呢,接下来就总结下牛老师写的存储过程中SQL语句,挺经典,举一反三 首先先展示出来适用于系统的三张表 新闻类…

【微信小程序 | 实战开发】配置微信小程序APPID并快速接入

写在前面: 你是否想要掌握人工智能的最新技术和应用?你是否想要成为未来社会的创新者和领导者?你是否想要和全球的优秀导师和同学一起学习和交流?如果你的答案是肯定的,那么欢迎来到床长人工智能教程网站,这里是你实现梦想的起点! 个人名片: 🐼作者简介:一名大一在校…

获取苹果收集设备ID的方法

目录 问题 解决 问题 如果我们想要通过工具获取苹果手机 iPhone 或者 iPad 的设备 ID,也就是 UDID。这个时候,很多人可能会问 UDID 是什么,UDID 是 iOS 设备的一个唯一识别码,每台 iOS 设备都有一个独一无二的编码,…

浅谈大数据广告下个人隐私保护,开发者视角的广告原理

本文已收录于 Github CodeClass 和 Gitee CodeClass 致力于打造高质量编程学习课堂,内含百篇原创技术文章,千本计算机开源电子书,谷歌、阿里大神开源 LeetCode 题解,各类编程学习资源,欢迎 star ,一起学习&…