热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

计算基础正在发生根本变革——解读“计算2.0”

计算基础正在发生根本变革——解读“计算2.0”孟岩从本质上看,软件实际上只是夹在人与硬件之间的一个中间层,人们使用软件的根本目的还是要让硬件运转起来为自

计算基础正在发生根本变革——解读“计算2.0

孟岩

从本质上看,软件实际上只是夹在人与硬件之间的一个中间层,人们使用软件的根本目的还是要让硬件运转起来为自己服务。硬件平台如果长期稳定,软件就能够安稳发展,建起高楼大厦,硬件基础如果打个喷嚏,软件就会得一场感冒。过去十几年来,我们的计算环境已经发生了很多变化,比如RISC的兴起,大规模服务器集群的发展,SIMD的普及,特别是网络的大发展,令人印象深刻。每一项变化都给软件带来一定程度的冲击。不过大部分情况下,这种冲击力度有限:只需要有一小部分人去关注就好了,他们会尽可能把这些变化包装起来,从而使得其余的绝大部分人不受影响,而又能够享受硬件发展带来的免费午餐。比如说,RISC跟硬件平台带来的变革是非常巨大的,但是只有编译器和操作系统开发者真正需要关注它。SIMD(MMX3DNow!SSEx)的发展使普通计算机处理多媒体数据的能力获得了本质提升,但是厂商们也推出了一系列封装库,使应用软件开发者们在不需对开发方式做重大改变的情况下享受这些发展成果。

然而站在今天这个时间点上往前看,就会看到,情况在发生的变化。发生在若干个不同领域的硬件进展,几乎在同时达到了可以被称之为“本质变化”的状态。而所有这些变化结合起来,则使我们面对一个自1980年代初PC崛起以来从来没有过的局面,一个可以毫不夸张地称之为“变革”的局面,我们称之为“计算2.0。在“计算2.0的时代里,软件开发者面对的平台会发生巨大的变化,而且这些变化很多是非常本质的,无法简单地使用“包装”的手段屏蔽掉,从而要求软件开发的实践也必将随之发生巨大的变化。这对软件产业的每一个人来说,是历史上很少会遇到的情况,给我们带来巨大的挑战和机遇。

下面就让我们一起来展望一下“计算2.0将给我们带来的冲击。


1. 多核与并发编程[1]

自从2005年初C++标准委员会主席Herb Sutter发表《并发的革命——免费午餐已经结束》的著名文章以来,多核已经成为整个软件社群里热门话题。在那篇文章里,Herb Sutter断言说,CPU频率的提高已经接近极限,摩尔定律的发展今后将依赖多核化进行下去,因此,软件若要在未来的环境下生存,必须考虑并发问题。接着,Herb Sutter做出了更大胆和更惊人的语言,那就是不存在解决多核编程问题的银弹,不存在可以简单地将并发编程问题化解掉的工具,开发高性能的并行程序必须要求开发者从根本上改变其编程方法。从某种意义上来说,这不仅仅是要改变50年来顺序程序设计的工艺传统,而且是要改变数百万年来人类顺序化思考问题的习惯,其困难程度可想而知!

将近3年后的今天,Herb Sutter的预言似乎初步得到了印证。单核机器现在已经成了过时货,并且很快就会加入古董的行列。而多核机器的价格正在迅速下降。如今花2万块钱人民币,可以买下“三个8”的刀片服务器——两个4核至强+8G内存+四块200G硬盘。再过一段时间,这个配置中的每项数据都会翻番。如果说在双核时代我们还可以假装一切都没有发生,那么当一台机器上出现16个核的时候,敢于去忽略这种体系结构上的根本变革的人,一定是疯子。

人们正在紧张地寻找着解决多核编程难题的方法。到目前为止,进展不太大。目前最理想的结果,就是类似Intel C++Intel Fortran这样的编译器,可以自动识别可并行化的循环运算,然后实施自动并行化。但是这距离全面并发还很遥远。类似MPIOpenMP这样的解决方案虽然早就存在,但是要得到普及难度不小。至于其他的一些常规方案,无非是优化多线程中的一些问题,比如无锁数据结构尝试避免加锁和解锁带来的巨大开销,而事务型内存也是为了优化多线程程序共享资源的性能和可靠性。专门为并发系统设计的语言Erlang,被很多人视为多核时代的Java,但是Erlang的长项在于并发任务的分发和同步,用它来处理计算密集型的任务,如图形图像多媒体处理和数值计算,效率之低令人无法接受。也许把Erlang当成计算的dispatcher,而让每个核上都继续以传统的单线程方式运行C程序是解决这类问题的办法。但是所有这些方法,都首先要求将任务分解成可同时并行的多个单元,并且将并行计算中的若干问题定义清楚。也就是说,这些方法都无法解决那个最大的挑战:人的思维方式转变问题。不改变我们编写应用程序的传统线性思维,所有这些工具都没有太大帮助。毫无疑问,这是摆在我们面前的最大难题之一。


2. 新计算设备



写作此文时,Amazon刚刚发布了电子书阅读器Kindle,这款产品的出现,基本上等于宣告电子阅读时代的降临,它所将引起的冲击必将是划时代的。然而对于开发者来说,它却只不过是在一个已经很长的新计算设备名单里又加上了一项。这个名单中包括:PS2/3,XBox/XBox360,Wii, Tivo,Game BoyGame Boy Advance,PSP,iPhone,Windows Mobile,Symbian,Linux Mobile,Blackberry,iPod,车载导航仪,当然,还有最最激动人心的机器人。有人大而化之将它们统称为“嵌入式设备”,然而这是一个非常具有误导性的说法,这些设备中的每一项都不是传统意义上的“嵌入式设备”,而是更接近于计算机的通用计算设备,更确切的说法应该是“专用的通用计算设备”。

仅仅十几年以前,我们可以安全地认为,世界上每台计算机都是PC,每台PC都用X86 CPU,都安装了DOS/Windows。随着最近几年来新的计算设备如雨后春笋般涌现,PC包打天下的时代已经一去不返,这一点已经非常清楚不过了。

然而,软件开发者并没有从过去20多年形成的单一平台迷思中摆脱出来。在软件系统开发中合理运用多平台特长,充分注重可移植性的思维尚未形成,大部分应用还是为传统PC平台开发的。这一点显然已经落后于时代的发展。当然,这也就给那些有识之士提供了难得的机遇,充分利用多平台整合的优势,就可以开发出革命性的新型应用。


3. GPGPU

CPU——中心处理单元,计算机的核心和大脑,一切的一切的主宰。”

教科书上这么告诉我们。

很遗憾,这种说法早就不是事实了。自从类似DMA这样的技术出现,CPU就在不断地“减负”。事实上一台计算机里有许多块不同的芯片,它们各自有各自的绝活,让整台计算机高速运转。不过,不管怎么说,CPU还是整台电脑里最强有力的中心,它最强大,最能干。对吗?

很遗憾,连这个说法也变得非常脆弱了。在那些装备有高级图形卡的电脑玩家的机器中,CPU已经不是最强大的计算单元了,取而代之的是GPU

GPU原本只是为了进行3D图形加速而诞生的芯片,由于其专用性,体系结构较之CPU大大简化,从而可以高度优化设计,进行大规模的浮点数并行计算。当代GPU在这方面的性能远远超过了CPU。在浮点数计算速度上,NVIDIA最新的GPU超过Intel最快的CPU10倍以上,而据称,这一差距在未来几年内会达到数百倍。单就这一点来说,GPU早就是计算机中最快的芯片了。

然而,由于GPU的专用性,大部分通用计算任务是无法用GPU来完成的。例如,连最最简单的分支语句,GPU都无法完成。因此,GPU永远不可能取代CPU。但是,GPU强大的计算能力如果仅仅给高性能图形程序和游戏来使用,也无疑是一种巨大的计算资源浪费,有没有可能将GPU的计算资源暴露给应用程序员,由他们将适合于GPU计算的任务转交给GPU完成,而把CPU解放出来干CPU擅长的工作呢?没错,这就是通用GPU计算(General Purpose GPU computing)的宗旨。

眼下,NVIDIAAMD(不久前收购ATI)都在加速推出对GPGPU开发的支持,而据传Intel也将在2008年推出自己的独立显卡,加入战局。这也就意味着,不出几年,每台电脑里都会存在两个强大的计算单元,一个是CPU,一个是GPU。软件开发人员将面临新的挑战——只有把任务合理地分配给CPUGPU,并且进行统一调度,才能够达到效率上的最佳化。此外,那时候的CPU8个或更多的核,而GPU本身更是高度并行化的计算单元,计算任务不仅要合理分布,还需要充分并行,这其中蕴含的挑战之大,足够令人心惊胆寒。然而,也正正创造了英雄横空出世的条件,谁能够横刀立马,谁就能功成名就。


4. 无处不在的网络

回到Kindle,这个产品最有趣的部分在于,你可以随时通过无线网络下载你想看的书,而且这些下载的书被保存在网络上你的一个私人空间里。你永远不会买不到想要的书,也永远不用担心家里太小,放不下这些书。如果你的Kindle丢失了或者你想换一台,没关系,你庞大的图书馆会毫发无损。

你觉得怎么样?非常好,对吗?但这需要一个条件,一个重要的条件——无所不在的网络,特别的,无所不在的无线网络。

不出几年,将不会再存在Internet的死角,在任何地方你都可以高速访问Internet。对软件开发者来说这意味着什么?这意味着很多过去惯用的软件设计思路将不再是最优的了,关于网络访问限制的很多担忧也变得不必要了。应用可以保证永远连网,用户数据也最好保存在网络上,密集的计算任务交给网络上的高速节点来执行,可能比本地执行更快。一言以蔽之,网络计算将全面取代单机计算,无论是对PC来说,还是对各种各样的小设备来说。

更重大的变化可能来自人们的生活方式,当互联网——这个目前世界上规模最大、最自由的网络——无处不在并且速度飞快的时候,其他的通信网络还有存在的必要吗?我们还需要使用中国移动的专有网络并且每个月为之付出不菲的费用吗?我们还需要忍受诸如“脑白金”那样的烂广告和矫揉造作的烂主持人吗?我们还需要买日报和杂志吗?可能都不需要了。互联网就是电视,互联网就是电话,互联网就是报纸,一切媒体归于互联网。这种局面会给人类的生存方式带来一个重大的变革,在其中蕴含着巨大机会、挑战和财富。在这个意义上,Google的成功只不过是一个序曲而已。

如上所述,相信您已经意识到我们处在一个怎样的变革当中!令我们兴奋不已的是,软件开发者在这个变革中处于前锋的位置,我们准备好了吗?






推荐阅读
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 探讨如何在Go语言中高效地处理大规模切片的去重操作,特别是针对百万级数据量的场景。 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 解决 Windows Server 2016 网络连接问题
    本文详细介绍了如何解决 Windows Server 2016 在使用无线网络 (WLAN) 和有线网络 (以太网) 时遇到的连接问题。包括添加必要的功能和安装正确的驱动程序。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 深入解析:Synchronized 关键字在 Java 中对 int 和 Integer 对象的作用与影响
    深入探讨了 `Synchronized` 关键字在 Java 中对 `int` 和 `Integer` 对象的影响。尽管初看此题似乎简单,但其实质在于理解对象的概念。根据《Java编程思想》第二章的观点,一切皆为对象。本文详细分析了 `Synchronized` 关键字在不同数据类型上的作用机制,特别是对基本数据类型 `int` 和包装类 `Integer` 的区别处理,帮助读者深入理解 Java 中的同步机制及其在多线程环境中的应用。 ... [详细]
  • OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战
    OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
author-avatar
Hello_DavidLeete_811
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有