免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 9608 | 回复: 32
打印 上一主题 下一主题

[技术动态] Linus Torvalds :忘掉那该死的并行吧! [复制链接]

论坛徽章:
6
CU大牛徽章
日期:2013-03-14 14:14:08CU大牛徽章
日期:2013-03-14 14:14:26CU大牛徽章
日期:2013-03-14 14:14:29处女座
日期:2014-04-21 11:51:59辰龙
日期:2014-05-12 09:15:10NBA常规赛纪念章
日期:2015-05-04 22:32:03
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-09 09:39 |只看该作者 |倒序浏览
在 Avoiding ping pong上,Linus Torvalds以其一贯高雅的调调抨击了“并行计算就是未来”的论调,并在原文和 Reddit上收获了数百条评论。虽然事情最终也没有一个结果,但是许多观点确实值得借鉴。

Linus论点如下:

    推崇并行只不过是浪费大家的时间,“并行更高效”这种理论纯属胡说八道。大容量缓存是高效的,如果缺少缓存,并行一些低等级微内核可以说是毫无意义,除下特定类型上大规模规则计算,比如图形处理。

    没有人会回到过去,那些复杂的乱序运行内核不会消失。扩展不可能无休止的进行,人们需求更多的移动性,那些叫嚣扩展到上千核心的论调纯属扯淡,无需理会。

    是有多么奇葩的思维才能幻想出这些神奇等等并行算法的用武之地?!

    对于并行来说,唯一的用武之地就是图形计算和服务器端,而并行计算在这些领域确实也得到了大量的应用。但是没有任何疑问,并行在其他领域毫无用武之地。

    所以,忘掉并行吧,它永远都不可能被大规模推广。对于终端用户来说,4核就差不多了,而在这个领域,如果不增加太多的能耗,你也无法塞入更多的内核。同时,也不会有智障去阉割内核,降低其大小和性能只为了多塞几个。通常情况下,阉割内核只是为了降低功耗,因此这里也不会有那么多阉割的内核让你使用。

    因此,讲究程序的并行性本质上就是错的,它基于了一个错误的前提,同时也只是一个早该过时的时髦术语。

    在图形计算和服务器端之外,并行并不是万金油。即使在未来全新的领域同样如此,因为你根本承担不起。如果你期望做低功耗计算机视觉,我敢肯定你一定不会在GP CPU上编码。你甚至不会去使用GPU,因为它的开销太大了。大部分情况下,你可能会选择一些特殊的硬件——可能会基于某些神经网络模型。

    放弃吧。“并行就是未来”的说法纯属胡说八道。

在看讨论之前,我们首先看一下Linus以reference counting为例说明了并行的复杂性(该部分转自CoolShell

在Linus回复之前有人指出对象需要锁机制的情况下,引用计数的原子性问题:

    由于(对象)通过多线程方式及多种获取渠道,一般而言它需要自身维护一个互斥锁——否则引用计数就不要求是原子的,一个更高层次的对象锁足矣。

而Linus不那么认为:

    引用计数的问题在于你经常需要在对象数据上锁保护之前完成它。

问题有两种情况,它们锁机制是完全不一样的:

    object *reference* 对象引用
    object data 对象数据

对象数据保护一般是一个对象拥有一个锁,假设你没有海量扩展性问题,不然你需要一些外部大一点的锁(极端的例子,一个对象一个全局锁)。

但对象引用主要关于对象的寻找(移除或释放),它是否在哈希链,一棵树或者链表上。当对象引用计数降为零,你要保护的不是对象数据,因为对象没有在其它地方使用,你要保护的是对象的寻找操作。

而且查询操作的锁不可能在对象内部,因为根据定义,你还不知道这是什么对象,你在尝试寻找它。

因此一般你要对查询操作上锁,而且引用计数相对那个锁来说是原子的(译者注:查询锁不是引用计数所在的对象所有,不能保护对象引用计数,后面会解释为何引用计数变更时其所在对象不能上锁)。

当然这个锁是充分有效的,现在假设引用计数是非原子的,但你常常不仅仅使用一种方式来查询:你可能拥有其它对象的指针(这个指针又被其它对象的对象锁给保护起来),但同时还会有多个对象指向它(这就是为何你第一时间需要引用计数的理由)。

看看会发生什么?查询不止存在一个锁保护。你可以想象走过一张对象流程图,其中对象存在指向其它对象的指针,每个指针暗含了一次对象引用,但当你走过这个流程图,你必须释放源对象的锁,而你进入新对象时又必须增加一次引用。

而且为了避免死锁,你一般不能立即对新对象上锁——你必须释放源对象的锁,否则在一个复杂流程图里,你如何避免ABBA死锁(译者注:假设两个线程,一个是A->B,另一个B->;A,当线程一给A上锁,线程二给B上锁,此时两者谁也无法释放对方的锁)?

原子引用计数修正了这一点,当你从对象A到对象B,你会这样做:

    对象A增加一次引用计数,并上锁。
    对象A一旦上锁,A指向B的指针就是稳定的,于是你知道你引用了对象B。
    但你不能在对象A上锁期间给B上锁(ABBA死锁)。
    对象B增加一次原子引用计数。
    现在你可以扔掉对象A的锁(退出对象A)。
    对象B的原子引用计数意味着即使给A解锁期间,B也不会失联,现在你可以给B上锁。

看见了吗?原子引用计数使这种情况成为可能。是的,你想尽一切办法避免这种代价,比如,你也许把对象写成严格顺序的,这样你可以从A到B,绝不会从B到A,如此就不存在ABBA死锁了,你也就可以在A上锁期间给B上锁了。

但如果你无法做到这种强迫序列,如果你有多种方式接触一个对象(再一次强调,这是第一时间使用引用计数的理由),这样,原子引用计数就是简单又理智的答案。

如果你认为原子引用计数是不必要的,这就大大说明你实际上不了解锁机制的复杂性。

相信我,并发设计是困难的。所有关于“并行化如此容易”的理由都倾向于使用简单数组操作做例子,甚至不包含对象的分配和释放。

那些认为未来是高度并行化的人一成不变地完全没有意识到并发设计是多么困难。他们只见过Linpack,他们只见过并行技术中关于数组排序的一切精妙例子,他们只见过一切绝不算真正复杂的事物——对真正的用处经常是非常有限的。(译者注:当然,我无意借大神之口把技术宗教化。实际上Linus又在另一篇帖子中综合了对并行的评价。)

哦,我同意。我的例子还算简单,真正复杂的用例更糟糕。

我严重不相信未来是并行的。有人认为你可以通过编译器,编程语言或者更好的程序员来解决问题,他们目前都是神志不清,没意识到这一点都不有趣。

并行计算可以在简化的用例以及具备清晰的接口和模型上正常工作。你发现并行在服务器上独立查询里,在高性能计算(High-performance computing)里,在内核里,在数据库里。即使如此,人们还得花很大力气才能使它工作,并且还要明确限制他们的模型来尽更多义务(例如数据库要想做得更好,数据库管理员得确保数据得到合理安排来迎合局限性)。

当然,其它编程模型倒能派上用场,神经网络(neural networking)天生就是非常并行化的,你不需要更聪明的程序员为之写代码。

在未来,应用程序究竟会发展成什么样?与现在有着非常大的区别?还是基本上相同,这里我们不妨看一下讨论(更多讨论见RedditAvoiding ping pong):

Martin Thompson:

一旦工作集的大小超过了缓存容量,更大的缓存毫无意义。在低延时领域,为了保证整个应用程序放到缓存,我们通常会不择手段,但是这绝对不是主流。使用更大的页,并让L2支持这些更大的页显然比实际缓存大小更有意义,当下我们已经可以看到很多大内存应用程序运行在Haswell上。

对比使用并行,通常情况下使用cache friendly 或者cache oblivious(实际上是cache friendly的升级)数据结构显然更具生产效率。时至今日,“如果把在Fork-Join和并行流上投入些许精力放到提供更好的通用数据结构上(比如Maps和Trees,cache friendly)是否会更划算”这样辩论已经不再是困扰。在所谓的“多核问题解决”上,对比FJ和并行流,主流应用程序显然可以获得更多的提升。在这里,并不是说FJ和并行流不是个好的解决方案,而是后者可以给投资带来更多的回报。

在并行和并发上也有很多实际的用例,其中Servlet模型就是一个很好的例子,甚至是PHP之类在服务器端上的扩展。当然,在这之上,管道的构建也是一个更为直观的模型。

当谈到数据结构上的并发存取时,数据结构可变需要被单独对待。如果数据结构是不可变的,或者支持无阻塞并发读取,那么在并行上将很容易扩展,也很容易被推断。并发修改任何有趣的远程数据结构(更不用说完整模型),管理起来都是非常复杂和困难的。抛开复杂性,任何从多个写入者到1个共享模型/状态的并发更新都会存在限制,这点已经被Universal Scalability Law证明。在核心越来越多的情况下,在需要扩展的情况下,我们经常和自己开玩笑——多个写入者到任何模型的更新是否是一个好主意。庆幸的是,在大多数开发的应用程序代码中,查询针对的模型通常都不会有变化。

基于产业并发存取共享状态的需求,一个严重的后果产生:我们通常都会同步的进行这个过程,并在一个分布式的环境中传播。在算法和方法设计时,我们需要拥抱异步方式以避免延时限制。通过异步方式,我们可以实现无阻塞访问,而基于强制隔离,我们可以让应用程序更好地执行,并拥有更好的弹性。带宽以高速提升,延时将趋于平稳。

新一年我对平台提供商的愿望清单是:基础设施将有更好的cache friendly和immutable,同时还具备让异步编程更容易的Append-Only 数据结构、更好的管道并发、无阻塞APIS(比如JDBC)、语言外延(比如支持state machines和continuations),以及可以做申明式查询的语言外延(比如 LINQ[3] for C#就可以提升)。同时也不要介意允许Java那种低等级访问,我们已经远超越了在浏览器沙箱中写程序的时代。

AntiProtonBoy:

通常情况下,我对Linus是非常不感冒的,但是公平来讲,这次他说的确实很有道理。大量核心一般是用在大规模分布式应用系统中,比如说你想模仿一个神经网络。而在这个情况,你肯定也不会使用20万台个人电脑。他只是说在用户空间,30个小的核心并不会比4到8个高速核心快,因此并行化在这里并没有什么优势,也只有在遭遇瓶颈时才考虑到瓶颈。

Gabriele Svelto:

着眼当下移动领域,“足够快”很可能并非优化的终点。现在大部分使用电池的计算设备都在致力让用户能够获得一个更快的感知速度,从而在总体上节省电量。在这方面,某些并行算法完全处于劣势:在同等条件下,它们通过等价串行的方式,以增加计算(通常是通信)开销为代价来换取更快的速度。在实践中,并不是所有计算之外的开销都是等价的,因此,你还需要分摊一些固定的开销,不过整体更快的执行可能更加有效;但也正是这样,衡量是否要增加某个负载的速度将需要考虑更多变数。

Jeft:

Linus的说法可以说对,也可以说不对。事实上,人们期待可以更有效利用并行硬件的途径已经相当久了,所以不能把这个作为新事物来看。事实上我们需要的不仅是语言,如果你给它分配了太多工作,将从根本上挑战语言的基本结构,我们需求的语言是在需要的情况下可以最简单地并行,我们才刚刚开始。

Patrick Chase:

所有的一切都决定于容量和速度上的改变。当容量不足和(或者)算法集不稳定时,你使用的是商业硬件,而这十年的风格一直是GPU。当容量变高了,算法更稳定了,你开始考虑定制硬件(当下,一般复杂的ASIC定制大约是1000万美元或者更高;结果就是,你可以通过数学来发现哪个更有意义)。

如果只是容量变高了,算法还有一部分不稳定,那么定制一个包含了固定功能硬件和可编程硬件(DSPs、GPUs等等)的ASIC则非常有意义。这也是为什么高通公司为所有的Snapdragons都添加了“Hexagon”。

Maynard Handley:

当下,我们甚至没有开始程序员的再教育,让他们可以用更好的方式做事(更好的意思是抽象更匹配并行编程)。我们的语言、API以及工具仍然很糟糕,就像使用Fortran来做递归和指针一样。当下我们的工具并没有重构,这也让我们避免去关心某个函数调用链是否增加了一个新的参数等。

Patrick Chase:

针对Gabriele提出的“那些问题可以通过选择不同的语言解决”,你说的对,但是在现实世界中根本不可行。对比10年前,并行技术在难易度和开销上并没有什么根本上的突破。没有出现神奇的编译器,没有出现突破性的方法和语言,Amdahl法则并没有得到实质性的缓解。

序列化性能一定程度上受到了半导体工艺的限制,在这里我没看到任何微核心在equilibrium和optimum可以利用的因素。

因此,我觉得“anon”说的不错:并行方案只在必要的时候选用,提升单核性能则在任何可能的情况下。虽然这不是一个很好的愿景,但是却可以work。

Linus Torvalds:

我可以想象到人们在服务器领域已经使用上了60核心,但是我们不认为这是件值得推广的事情。我认为,在服务器端增加更多的缓存和集成更多的IO同样更具效率。

在客户端方面,仍然存在一些类似工作站的负载可以使用16核心,我认为借助它们,美术家确实可以更快地做Photoshop和视频编辑工作。但是从全局来看,这部分市场份额非常之小,从台式电脑市场萎缩就可见一斑。

因此,市场的趋势更应该是“4核心搭载大量的集成,既便宜又低功耗”。

但是,预测是困难的,特别是对未来,我们需要边走边看。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
2 [报告]
发表于 2015-01-09 11:21 |只看该作者
本帖最后由 yulihua49 于 2015-01-09 11:52 编辑
wang290 发表于 2015-01-09 09:39
在 Avoiding ping pong上,Linus Torvalds以其一贯高雅的调调抨击了“并行计算就是未来”的论调,并在原文和 ...

提升单核性能  ---  现在主频已经达到极限,还有什么办法能够提高性能吗?
对于终端用户来说,4核就差不多了 --  现在32核很普通了,128核也不稀奇了。还可以多CPU啊,还可以多服务器啊,在一个系统中,成千上万的核已经不是幻想。
在图形计算和服务器端之外  ---  把一半的计算机世界都除去了,这个论点还有什么意义吗?数十亿的客户端几乎都是由数百万的服务器提供支持,他们就像我们的左手和右手,各占半边天。云计算,大数据,哪个不靠服务器?哪个服务器不需要并行?
并行计算就靠优秀的软件,那些开发简单软件---把性能问题丢给硬件的论点,才是真正过时的论点。因为,性能,永远没有够的时候。


linus,老了,跟不上时代了。他那个linux,不就是做服务器的强项?做客户端,它拼得过WINDOWS吗?

linux,那个非抢占的优先级调度,一直是备受UNIX世界攻击的,对于做服务器也是很不利的。

并行计算中,的确存在很多难题,人们因此付出不懈的努力,并获得了有效的进展。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2015-01-09 11:30 |只看该作者
核太多,程序写得不好发挥不了作用。

论坛徽章:
6
CU大牛徽章
日期:2013-03-14 14:14:08CU大牛徽章
日期:2013-03-14 14:14:26CU大牛徽章
日期:2013-03-14 14:14:29处女座
日期:2014-04-21 11:51:59辰龙
日期:2014-05-12 09:15:10NBA常规赛纪念章
日期:2015-05-04 22:32:03
4 [报告]
发表于 2015-01-09 18:47 |只看该作者
yulihua49 发表于 2015-01-09 11:21
提升单核性能  ---  现在主频已经达到极限,还有什么办法能够提高性能吗?
对于终端用户来说,4核就差不 ...


大神你是理解不了的

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2015-01-10 08:00 |只看该作者
正在折腾 cuda 的路过

求职 : Linux运维
论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:15:0815-16赛季CBA联赛之山东
日期:2016-10-31 10:40:10综合交流区版块每日发帖之星
日期:2016-07-06 06:20:00IT运维版块每日发帖之星
日期:2016-02-08 06:20:00数据库技术版块每日发帖之星
日期:2016-01-15 06:20:00IT运维版块每日发帖之星
日期:2016-01-15 06:20:00IT运维版块每日发帖之星
日期:2016-01-10 06:20:00黄金圣斗士
日期:2015-11-24 10:45:10IT运维版块每日发帖之星
日期:2015-09-01 06:20:00IT运维版块每日发帖之星
日期:2015-08-13 06:20:00IT运维版块每日发帖之星
日期:2015-07-30 09:40:012015年亚洲杯之巴勒斯坦
日期:2015-05-05 10:19:03
6 [报告]
发表于 2015-01-10 09:15 |只看该作者
我觉得没有强大的本地化。说什么并行也是扯淡的。现在的所谓集群并行首先依托的是单个神经节点的本地化强大功能和更高效的网络。我们因该让神经节点具备一种模式设别功能。这样强大的本地化就可以很自然的处理各种复杂的情况。然后基于网络环境下的并行就自然形成了

论坛徽章:
0
7 [报告]
发表于 2015-01-10 22:55 |只看该作者
大神和我一样,说话总是爱冲动。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
8 [报告]
发表于 2015-01-11 19:27 |只看该作者
niao5929 发表于 2015-01-10 09:15
我觉得没有强大的本地化。说什么并行也是扯淡的。现在的所谓集群并行首先依托的是单个神经节点的本地化强大 ...

??并行有很多方法,你说的是-------?

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
9 [报告]
发表于 2015-01-12 10:13 |只看该作者
回复 8# yulihua49

先说一下Linus,我觉得他有时候会矫枉过正。


大概几年前,工业界和学术界有这么一种提法:尽最大的可能增加核心的数目,不惜牺牲单个核心的性能。一个众核(many core)的概念开始流行。
很多人认为分支预测、高速缓存、乱序执行等技术非常耗电,采用众核的方法增加核心数目来增加性能,比提升单核性能在性能/功耗比上更合算。
所以产生了一些奇怪的硬件,动不动几百上千个核心,每个核心都非常挫。理论上,只要程序写的好,性能是没有问题的,好处是:
1.可以无限水平扩展,要更高性能只要增加核心就好了
2.省电

我觉得这套路很比较扯,毕竟写并行化程序是非常困难的,很多程序天生难以并行化,还有一些算法并行化后性能随着核心增加的提升并不理想。
我不清楚Linus是否主要针对这种技术吐槽,但感觉下面回复有一些是针对这种趋势的。
   

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
10 [报告]
发表于 2015-01-12 11:35 |只看该作者
本帖最后由 yulihua49 于 2015-01-12 11:56 编辑
zhaohongjian000 发表于 2015-01-12 10:13
回复 8# yulihua49

先说一下Linus,我觉得他有时候会矫枉过正。

这不是什么观点问题,一切都是无奈之举,主频,受量子力学和光速限制,已经达到极限。
首先,单元已经是原子级,不能再小了,芯片尺寸,已经与主频的波长接近,主频也不能再提高。
分支预测、高速缓存、乱序执行也都没有放弃。
多核的芯片更大,所以主频略低。
有两种选择,较小的芯片和较高的主频,或者较大的芯片(多核)和较低的主频。
或者,用较小的芯片堆叠,并联,减少波的传播距离?散热怎么办?我也不是制造芯片的,说了不算。
不管怎么说,多核是(提高性能的)唯一途径。
那么,并行处理,交给软件了。(做硬件的,把球又抛给了软件)。
像12306那样的商业系统,除了并行,还能指望什么技术呢?
所以,面对几十个核(很普通的系统),往往是利用率很低,这就表现出软件的薄弱,就值得我们去研究,怎能忘掉那该死的并行呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP