(done) 并行计算 CS149 Lecture8 (并行原语 Data-Parallel Thinking)

url: https://www.bilibili.com/video/BV1du17YfE5G/?spm_id_from=333.788.videopod.sections&p=8&vd_source=7a1a0bc74158c6993c7355c5490fc600


之前的 CUDA 和 cpp 线程实验里,我们做的并行类似于从 “workers 做什么” 这个角度来理解。
现在我们要开始尝试从 “一序列数据的操作” 这个角度来理解并行算法。
在这里插入图片描述

合理设计算法,让它暴露出大量并行性,我们才能充分利用:
1.多 Core
2.多机器 (分布式)
3.SIMD 处理 + 多线程
4.GPU
在这里插入图片描述

并行编程的关键部分永远是找到程序中的依赖关系。
没有依赖意味着有并行潜力。
在这里插入图片描述

一个经典的并行数据模型就是把输入数据序列化(如放入矢量里),从而可以用 SIMD,多线程,GPU 等方式并行计算。
在这里插入图片描述

一个比较泛化的数据类型概念:序列
序列是一组有序数据的集合,在不同编程语言里有不同的具体形式。
与数组不同,数组可以直接说,我要访问 array[43] 来访问第43个元素。
序列需要特定操作才能访问(估计是封装好的操作)
(之所以要用封装好的操作,禁止用户随意使用 sequence[i] 是为了避免在程序中出现依赖关系)
在这里插入图片描述

先来看第一个序列的特定操作,Map,它接收两个参数,分别是一个函数指针 f,以及一个输入序列 input。
它的输出是一个序列,output = f(input)。output 长度与 input 等长。对于每个 input 的元素 input[i],output[i] = f(input[i])。
通过这种方式抽象、封装我们的代码,map 的实现者可以很轻松的去增加代码的并行化。
在这里插入图片描述

一个比较简单的并行化 map 的方式是:把输入序列切成多段,每一段使用多线程 map 函数去用 f 计算那一段的输出序列,最后再把输出序列拼起来。(这里似乎没用到 GPU,因此并行极限应该是核数量)
在这里插入图片描述

接下来介绍第二封装操作:Fold 折叠,左折叠。
具体的作用看下图
在这里插入图片描述

对于 fold 的并行化很简单。把输入序列切成几段,分别使用 fold f,得到单个元素,随后使用用户提供的 co

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值