问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

并行编程技术是谁的核心技术体系

发布网友 发布时间:2023-04-07 07:58

我来回答

1个回答

热心网友 时间:2024-07-24 15:46

并行编程技术是谁的核心技术体系
在摩尔定律失效之前,提升处理器性能通过主频提升、硬件超线程等技术就能满足应用需要。随着主频提升慢慢接近撞上光速这道墙,摩尔定律开始逐渐失效,多核集成为处理器性能提升的主流手段。现在市面上已经很难看到单核的处理器,就是这一发展趋势的佐证。要充分发挥多核丰富的计算资源优势,多核下的并行编程就不可避免,Linux kernel就是一典型的多核并行编程场景。但多核下的并行编程却挑战多多。

多核并行编程的挑战

目前主流的计算机都是冯诺依曼架构,即共享内存的计算模型,这种过程计算模型对并行计算并不友好。下图是一种典型的计算机硬件体系架构。

这种架构中,有如下设计特点:

多个CPU核改善处理器的计算处理能力;
多级cache改善CPU访问主存的效率;
各个CPU都有本地内存(NUMA(非一致性内存访问)),进一步改善CPU访问主存的效率;
store buffer模块改善cache write由于应答延迟而造成的写停顿问题;
invalidate queue模块改善使无效应答的时延,把使无效命令放入queue后就立即发送应答;
外设DMA支持直接访问主存,改善CPU使用效率;
这些硬件体系设计特点也引入很多问题,最大的问题就是cache一致性问题和乱序执行问题。

cache一致性问题由cache一致性协议MESI解决,MESI由硬件保证,对软件来说是透明的。MESI协议保证所有CPU对单个cache line中单个变量修改的顺序保持一致,但不保证不同变量的修改在所有CPU上看到的是相同顺序。这就造成了乱序。不仅如此,乱序的原因还有很多:

store buffer引起的延迟处理,会造成乱序;
invalidate queue引起的延迟处理,会造成乱序;
编译优化,会造成乱序;
分支预测、多流水线等CPU硬件优化技术,会造成乱序;
外设DMA,会造成数据乱序;
这种情况造成,就连简单的++运算操作的原子性都无法保证。这些问题必须采用多核并行编程新的技术手段来解决。

多核并行编程关键技术

锁技术

Linux kernel提供了多种锁机制,如自旋锁、信号量、互斥量、读写锁、顺序锁等。各种锁的简单比较如下,具体实现和使用细节这里就不展开了,可以参考《Linux内核设计与实现》等书的相关章节。

自旋锁,不休眠,无进程上下文切换开销,可以用在中断上下文和临界区小的场合;
信号量,会休眠,支持同时多个并发体进入临界区,可以用在可能休眠或者长的临界区的场合;
互斥量,类似与信号量,但只支持同时只有一个并发体进入临界区;
读写锁,支持读并发,写写/读写间互斥,读会延迟写,对读友好,适用读侧重场合;
顺序锁,支持读并发,写写/读写间互斥,写会延迟读,对写友好,适用写侧重场合;
锁技术虽然能有效地提供并行执行下的竞态保护,但锁的并行可扩展性很差,无法充分发挥多核的性能优势。锁的粒度太粗会*扩展性,粒度太细会导致巨大的系统开销,而且设计难度大,容易造成死锁。除了并发可扩展性差和死锁外,锁还会引入很多其他问题,如锁惊群、活锁、饥饿、不公平锁、优先级反转等。不过也有一些技术手段或指导原则能解决或减轻这些问题的风险。

按统一的顺序使用锁(锁的层次),解决死锁问题;
指数后退,解决活锁/饥饿问题;
范围锁(树状锁),解决锁惊群问题;
优先级继承,解决优先级反转问题 ;
原子技术

原子技术主要是解决cache和内存不一致性和乱序执行对原子访问的破坏问题。Linux kernel中主要的原子原语有:

ACCESS_ONCE()、READ_ONCE() and WRITE_ONCE():禁止编译器对数据访问的优化,强制从内存而不是缓存中获取数据;
barrier():乱序访问内存屏障,*编译器的乱序优化;
smb_wmb():写内存屏障,刷新store buffer,同时*编译器和CPU的乱序优化;
smb_rmb():读内存屏障,刷新invalidate queue,同时*编译器和CPU的乱序优化;
smb_mb():读写内存屏障,同时刷新store buffer和invalidate queue,同时*编译器和CPU的乱序优化;
atomic_inc()/atomic_read()等:整型原子操作;
严格来说,Linux kernel作为系统软件,实现受硬件影响很大,不同硬件有不同的内存模型,因此,不同于高级语言,Linux kernel的原子原语语义并没有一个统一模型。比如在SMP的ARM64 CPU上,barrier、smb_wmb、smb_rmb的实现与smb_mb都是一样的,都是volatile ("" ::: "memory")。

另外,再多提一句的是,atomic_inc()原语为了保证原子性,需要对cache进行刷新,而缓存行在多核体系下传播相当耗时,其多核下的并行可扩展性差。

无锁技术

上一小节中所提到的原子技术,是无锁技术中的一种,除此之外,无锁技术还包括RCU、Hazard pointer等。值得一提的是,这些无锁技术都基于内存屏障实现的。

Hazard pointer主要用于对象的生命周期管理,类似引用计数,但比引用计数有更好的并行可扩展性;
RCU适用的场景很多,其可以替代:读写锁、引用计数、垃圾回收器、等待事物结束等,而且有更好的并行扩展性。但RCU也有一些不适用的场景,如写侧重;临界区长;临界区内休眠等场景。
不过,所有的无锁原语也只能解决读端的并行可扩展性问题,写端的并行可扩展性只能通过数据分割技术来解决。

数据分割技术

分割数据结构,减少共享数据,是解决并行可扩展性的根本办法。对分割友好(即并行友好)的数据结构有:

数组
哈希表
基树(Radix Tree)/稀疏数组
跳跃列表(skip list)
使用这些便于分割的数据结构,有利于我们通过数据分割来改善并行可扩展性。

除了使用合适的数据结构外,合理的分割指导规则也很重要:

读写分割:以读为主的数据与以写为主的数据分开;
路径分割:按独立的代码执行路径来分割数据;
专项分割:把经常更新的数据绑定到指定的CPU/线程中;
所有权分割:按CPU/线程个数对数据结构进行分割,把数据分割到per-cpu/per-thread中;
4种分割规则中,所有权分割是分割最彻底的。

以上这些多核并行编程内容基本上涵盖了Linux kernel中所有的并发编程关键技术。当然并行编程还有很多其他技术没有应用到Linux kernel中的,如无副作用的并行函数式编程技术(Erlang/Go等)、消息传递、MapRece等等。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
下载了优酷播放器iku免登录版,安装在没联网的电脑上。查看不了本地的... 播放FLV的几个问题在线等 劲舞团真的有那么好玩吗? 为什么别人说劲舞团是世界上最淫荡的游戏.. 劲舞团好玩吗?? 030221 1020 060414 2168 060417 这几组数是什么意思啊!有知道的大哥请... ...分签约短信服务-【广东农信】”是什么意思? 2168是什么意思爱情 事业单位面试成绩79分算好的吗 事业编面试成绩76分算高分吗 情人让我贷款给他还账我要他开具哪些东西便于以后使用 老婆帮老公贷款还债算谁的债务 借钱还债受到法律的保护吗 银行贷款还债 信用卡快捷还款方式有哪些 关闭当前文档有哪些方法?在关闭过程中可能会出现哪些情况? 铝合金作的网状兜,可以用醋洗污垢嘛? 毕业论文中期检查报告怎么写呢? 清凉一夏,和哈弗M6一起下乡摘西瓜记! 小朋友摘西瓜,一共不到40个,平均装在6个筐子,还剩4个,这次小朋友最多摘... 毕业论文中期检查报告要怎么写呢? 周文雍的诗 仅退款成功不退货算诈骗吗? 康师傅备品管理员是干什么? 康师傅库管能长期干吗 康师傅仓库管理员怎么样啊 石榴石命是什么意思 宠物店如何做促销活动 宠物店的会员卡是必须要充值1000块的吗 ...最近发现桌面的图标的左下方多了好多小箭头,怎么消除哇? nx软件如何让双路cpu36核并行运算编程? 《深入理解并行编程》epub下载在线阅读,求百度网盘云资源 事故责任认定我全责,对方现金保全我的车5万,我的车险都全,要提车少交 ... 清明上河园端门几点关门 清明上河园有时间限制吗 开封清明上河园下午五点半清场必须出来吗 清明上河园门票多少钱清明上河园租古装多少钱 清明上河园日场票能待到晚上吗 蔚来es8换一组电池多少钱 形容女人服侍很多男的难听的成语 今年还高职扩招吗? 用labelme标注后自动生成的是什么软件 抖音里的橱窗商品是帮谁买的 我想学漫画.在哪学好呢?需要什么专长吗? 我想学漫画.可以先不学素描吗.!光临画这样会有什么效果吗? 为什么选海尔自驾作为案例来分析制造企业应收账款问题绪论 谷口作原文|翻译|赏析_原文作者简介 南京产什么茶叶 南京产的茶叶 南京下关茶叶城几点开门 南京哪能买到绿茶粉??普洱茶?