【并行计算】【《并行程序设计导论》笔记】第二章:并行硬件和并行软件(4107字)


因上努力

个人主页:丷从心·

系列专栏:并行计算

果上随缘


2.1|背景知识

冯·诺依曼结构
  • 主存和 C P U CPU CPU之间的分离称为冯·诺依曼瓶颈

2.2|对冯·诺依曼模型的改进

指令级并行
多发射
  • 多发射处理器通过复制功能单元来同时执行程序中的不同指令
  • 如果功能单元是在编译时调度的,则称该多发射系统使用静态多发射,如果是在运行时间调度的,则称该多发射系统使用动态多发射
  • 一个支持动态多发射的处理器称为超标量
硬件多线程
同步多线程
  • 同步多线程是细粒度多线程的变种,通过允许多个线程同时使用多个功能单元来利用超标量处理器的性能
  • 通过指定优先线程能够在一定程度上减轻线程减速的问题,优先线程是指有多条指令就绪的线程

2.3|并行硬件

SIMD系统
  • 典型的冯·诺依曼系统是单指令流单数据流系统
向量加法
  • 有两个数组 x x x y y y,每个都有 n n n个元素,把 y y y中的元素加到 x x x
for (i = 0;i < n;i++)
    x[i] += y[i]
  • 假如 S I M D SIMD SIMD系统中有 n n n A L U ALU ALU,能够将x[i]y[i]加载到第 i i i A L U ALU ALU中,然后让第 i i i A L U ALU ALUx[i]y[i]相加,最后将结果存储在x[i]
  • 在经典的 S I M D SIMD SIMD系统中, A L U ALU ALU必须同步操作,即在下一条指令开始执行之前,每个 A L U ALU ALU必须等待广播
向量处理器
向量寄存器
  • 向量寄存器是能够存储由多个操作数组成的向量,并且能够同时对其内容进行操作的寄存器,向量的长度由系统决定
向量指令
  • 只需要一次加载、一次加法和一次存储操作就能完成对长度为vector_length的数据块的操作
交叉存储器
  • 内存系统由多个内存“体”组成,每个内存体能够独立访问
  • 在访问完一个内存体之后,再次访问它之前需要有一个时间延迟,如果向量中的各个元素分布在不同的内存体中,那么在装入 / / /存储连续数据时能够几乎无延迟地访问
步长存储器访问和硬件散射/聚集
  • 程序能够访问向量中固定间隔的元素
  • 散射 / / /聚集是对无规律间隔的数据进行读(聚集)和写(散射)
向量编译器
  • 向量编译器擅长于识别向量化的代码
  • 能识别出不能向量化的循环而且能提供循环为什么不能向量化的原因
可扩展性
  • 向量处理器不能处理不规则的数据结构和其他的并行结构,这对可扩展性是个限制
图形处理单元(GPU)
  • 通过在每个 G P U GPU GPU处理核中引入大量的 A L U ALU ALU来使用 S I M D SIMD SIMD并行
  • 为了避免内存访问带来的延迟, G P U GPU GPU严重依赖硬件多线程
MIMD系统
  • M I M D MIMD
<think> 首先,用户的问题是关于《并行计算导论》中利用并行计算思想进行矩阵乘法的内容。用户想查找相关内容,并可能希望得到解释。 从系统级指令中,我需要: - 使用$...$格式表示行内数学表达式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,如[^1]。 用户提供的引用包括: - [^1]: Linux并行计算.pdf, 并行计算导论(原书第2版) 清晰PDF。描述了书的整体内容。 - [^2]: 并行计算导论目录,包括并行计算介绍、应用等。 - [^3]: 并行计算导论笔记1,提到矩阵乘法的数据分配,如一维分配,每个进程处理A矩阵的n/p行。 - [^4]: MPI并行计算学习笔记3——对等模式下的矩阵向量乘法,详细描述了矩阵向量乘法的并行实现。 用户特别提到了“利用并行计算思想进行矩阵乘法”,所以焦点在矩阵乘法的并行化。 关键引用是[^3][^4]: - [^3]说:一维分配,每个进程划分A矩阵的n/p个行,每行有n个元素,访问A矩阵的n^2/p个元素。对于B矩阵,要访问所有行。 - [^4]描述了在MPI中对等模式下的矩阵向量乘法,包括如何分配矩阵行、使用MPI_ScatterMPI_Gather等。 我需要构建一个清晰的中文回答,解释并行矩阵乘法。 矩阵乘法的基本公式是:如果$A$是m×n矩阵,$B$是n×p矩阵,那么$C = A \times B$,其中$c_{ij} = \sum_{k=1}^{n} a_{ik} b_{kj}$。 在并行计算中,常见的策略是数据划分: - 行划分:每个进程处理A矩阵的一部分行。 - 列划分:处理B矩阵的一部分列。 - 块划分:矩阵分成子块。 从引用[^3],是行划分:每个进程处理A的n/p行。 从引用[^4],是对等模式下的矩阵向量乘法(即B是向量),但原理可扩展到矩阵乘法。 对于矩阵乘法(不是向量),常见的并行方法是: - 使用1D或2D划分。 - 在MPI中,使用广播、收集等操作。 回答结构: 1. 介绍并行矩阵乘法的概念。 2. 解释数据划分方法,如一维行划分。 3. 描述计算过程。 4. 讨论优化挑战。 5. 参考引用。 数学表达式: - 行内:如$c_{ij} = \sum_{k=1}^{n} a_{ik} b_{kj}$ - 独立公式:如矩阵乘法公式。 生成相关问题:在回答末尾添加相关问题。 引用标识:在描述引用内容后添加[^n]。 现在,构建回答: - 开头:解释并行矩阵乘法在《并行计算导论》中的内容。 - 主体: - 数据划分方法。 - 并行算法描述。 - 使用MPI实现(参考[^4])。 - 结束:总结。 - 相关问题。 确保使用中文。 </think> ### 《并行计算导论》中基于并行计算思想的矩阵乘法 在《并行计算导论》中,矩阵乘法的并行化是一个核心主题,它利用数据划分分布式计算来提高大规模矩阵运算的效率。矩阵乘法的标准形式是:给定两个矩阵$A$(大小为$m \times n$)$B$(大小为$n \times p$),结果矩阵$C$(大小为$m \times p$)的元素定义为: $$c_{ij} = \sum_{k=1}^{n} a_{ik} b_{kj}$$ 其中,$i$从1到$m$,$j$从1到$p$。在串行计算中,时间复杂度为$O(mnp)$,对于大型矩阵(如科学计算中的稠密矩阵),这会导致性能瓶颈。并行计算通过将矩阵划分为子块,并在多个处理器上同时计算部分结果来加速运算。书中详细讨论了基于消息传递接口(MPI)的实现,核心思想包括数据划分、任务分配通信优化[^1][^2]。 #### 并行矩阵乘法的关键方法 1. **数据划分策略**: - **一维行划分**:这是最常见的方法,适用于对等模式(所有进程承担相似任务)。将矩阵$A$按行划分为$p$块($p$为处理器数量),每个处理器负责$A$的$\frac{n}{p}$行(假设$n$能被$p$整除)。矩阵$B$通常被广播到所有处理器,因为每个$c_{ij}$的计算需要访问$B$的全部列[^3]。每个处理器计算局部结果: - 处理器$i$计算$C_i = A_i \times B$,其中$A_i$是$A$的第$i$块。 - 然后,通过收集操作将局部$C_i$合并为最终$C$。 - **二维块划分**:对于更优的负载平衡,矩阵被划分为$\sqrt{p} \times \sqrt{p}$子块。每个处理器处理一个子块对($A_{ik}$$B_{kj}$),计算$C_{ij} = \sum_{k} A_{ik} B_{kj}$。这减少了通信开销,但需要更复杂的同步[^2][^4]。 - 划分策略的选择取决于矩阵大小、处理器数量内存带宽。例如,在行划分中,每个处理器访问$A$的$\frac{n^2}{p}$个元素$B$的$n^2$个元素(通过广播),访问次数为$O(\frac{n^2}{p}) + O(n^2)$[^3]。 2. **并行算法实现(基于MPI)**: - 书中使用MPI作为编程模型,实现对等模式下的并行矩阵乘法。核心步骤包括: - **初始化**:所有处理器初始化矩阵数据。主处理器(通常为rank 0)读取输入矩阵$A$$B$。 - **数据分发**:使用`MPI_Scatter`将$A$的行块分发到各处理器。例如: ```c MPI_Scatter(&A[0][0], rows_per_proc * n, MPI_DOUBLE, &local_A[0][0], rows_per_proc * n, MPI_DOUBLE, 0, MPI_COMM_WORLD); ``` 其中,`rows_per_proc`是$\frac{n}{p}$,确保每个处理器获得连续的内存块[^4]。 - **广播矩阵B**:使用`MPI_Bcast`将整个$B$广播到所有处理器,因为每个局部计算都需要$B$的所有元素。 - **局部计算**:每个处理器计算其$A_i$块与$B$的乘积,得到局部$C_i$。时间复杂度为$O(\frac{m n p}{p}) = O(m n)$(假设$m=n$)。 - **结果收集**:使用`MPI_Gather`将局部$C_i$收集到主处理器: ```c MPI_Gather(&local_C[0][0], rows_per_proc * p, MPI_DOUBLE, &C[0][0], rows_per_proc * p, MPI_DOUBLE, 0, MPI_COMM_WORLD); ``` - 如果矩阵大小不能被$p$整除,需添加填充行(如零行)或使用变长通信函数(如`MPI_Scatterv`)[^4]。 3. **性能分析与优化**: - **通信开销**:行划分的主要瓶颈是广播$B$,通信量为$O(n^2)$,可能成为性能限制。优化方法包括: - 使用树状广播减少延迟。 - 在二维划分中,采用Cannon算法或Fox算法,将通信开销降至$O(n^2 / \sqrt{p})$[^1][^2]。 - **计算负载平衡**:一维划分在处理器数量$p$较大时可能导致负载不均(如果$n$不整除$p$)。书中建议使用动态任务调度或混合并行模型(如结合OpenMP)[^4]。 - **内存使用**:每个处理器只需存储$\frac{n^2}{p}$个元素,显著减少内存需求,适用于分布式系统[^3]。 - 实测加速比接近线性,例如在$p$个处理器上,理想加速为$p$倍,但受通信延迟影响。 #### 应用与挑战 - **应用场景**:并行矩阵乘法广泛用于科学计算(如有限元分析)、机器学习(如神经网络训练)大数据处理(如推荐系统)[^2]。 - **挑战**:书中强调通信是主要瓶颈,尤其在高速网络缺失的系统中。解决方案包括优化网络拓扑(如使用网格互联)异步通信[^1][^4]。 总之,《并行计算导论》系统阐述了矩阵乘法的并行化,强调以平台无关的抽象模型设计算法,并通过MPI等标准实现可移植性。实际应用时,需根据问题规模调整划分策略[^1][^2][^3][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值