搜狐网站
搜狐 ChinaRen 17173 焦点房地产 搜狗
搜狐数码-搜狐网站
搜狐数码频道 > 2007北京英特尔信息技术峰会IDF > 07IDF相关报道

技术解析:软件性能优化

  罗杰飞: 大家好,我是一个常驻中国的研究人员,我希望有机会可以更深入的交谈。今天我给大家介绍的是软件的问题,这个实际上是编程人员所感兴趣的问题,首先我想很快给大家介绍一下并行处理能力,就是英特尔处理器的并行处理能力,然后再给大家讨论一下英特尔开发出的一些工具,帮助这些工作人员进行并行处理的工作。

然后,我们再给大家介绍一下这样的工具,怎么应用到一些情况中去。 今天我想给大家讲的要点,就是英特尔公司确实有非常好的软件工具,帮助你们进行并行处理,同时从你的分析中得到最佳的结果和效果。去年,当我们推出了双核时候我们进入新的时代,过去旧的时代,性能是通过频率的提高提升的,这对软件编程人员是好事,因为每隔两年一个新的处理器推出以后有,有更高的时钟频率,你可以做更多的工作。当然,现在有很多很好的算法,但是你还要等一年,才能使处理器做的更快。但是,新的时代并不是完全如此了,新的时代中,我们发现性能主要是跟并行处理是有关的,因此各种质量,我们通过周期来进行,就是性能等同于IPC。


  罗杰飞: 因此,大家看看这个图,这就是我们英特尔酷睿2,这是两个不同的执行的通道,大家可以看,有两个东西同时运行,或者是你必须有两个工作同时进行,或者是编程必须有各种多线程的情况才能出现。如果你看看每一个单独的通道指令的时候,你可以看到各种不同的指令级,提取指令进行编辑、编码,大家看这个小的箭头告诉我们,我们从第一阶段到第二个阶段的运动方向,实际上我们在执行五个不同的任务。如果你要看有些不同的层面,不同阶段,只有4个不同的运行,我们称之为4个问题的机器,也就是我们可以同时在一个中执行四个指令。过去大家看英特尔486的时候,只是一个问题的,奔腾是两个,高能奔腾是三个问题,十年以来,现在我们已经有了双核,是4指令的任务。 我们同时在单一指令当中处理多重任务的任务也加强了,在酷睿架构当中有一个128比特的寄存器,我们可以把它作为一个32比特的向量,然后这四个值的指令可以并行的运行,不管SSE的操作是什么样的。

  罗杰飞: 在库存微架构当中,我们能够在一个周期当中去执行这四个操作,这样能够充分利用刚才我向大家介绍的这样一个向量。如果我们能够把多个问题组合在一起,这样我们就能够带来性能大幅度的提升,这是对我们的管线当中有五个执行单元,其中有一个乘数管线可以做128位乘法,可以做4个指令排序解码和再分配,可以在这个过程中完成18个操作。如果这个值上升到64个的话,我们将在一个周期中执行十个操作,在昨天和今天的演示中,特别是我们显卡的显示中,大家可以看到性能有了明显的提高。并行是分三级的,便携性是基础的,然后有单指令数据并行,然后是多核多线程并行。如果把这几种放在其中会有更大性能的提升。在去年推出酷睿微架构的时候,和90年代中期推出奔腾专业版以来,性能已经有了飞跃。而且对于软件充分利用这些性能带来了非常大的机遇。 我们看看在并行方面英特尔推出了哪些工作,我们希望我们的应用能够运行的更快,这要做四个方面的工作,第一个是架构分析,要看看我们的程序怎么和架构实现映射,这样我们有一个工具是做性能分析的。一旦我们理解了架构之后,我们将要引入并行,这是第二项任务。英特尔有高质量的C++编译器,这些编译器能够在程序当中有很好的排期工具,以及在指令级实现编译器。而在IA的架构当中,这是最佳的编译器。同时呢,我们也需要一种叫做矢量化的技术,英特尔已经实施了矢量化的技术,我们这个新的编译器能够在指令中发现矢量,并且加以声成用以SSE操作。然后,我们的编译器既能去发现,同时如果开发人员自己做一个表述的话,就能够带来更好的效果。我们还有线程构建模块,也是使用C++语言。

  罗杰飞: 然后,我们还有一系列的性能库,来帮大家找到在编程的时候需要的各种并行性的程序。首先我们要确保程序运行是正确的,而且速度更快。 这样我们有一个线程检查器,这个在业界是独一无二的,能够对程序进行检测,而且可以找到会造成缺陷的数据分享的错误。一旦程序投入运行之后,我们必须要确保我们的并行策略得到良好的执行。这样,我们又有一个线程配置器来帮助我们实现。这样我们在完成一个周期之后,又可以回到一个更高的起点。 我给大家举一个对于质数生成的一个很简单的程序,我们并不推荐用这种方法计算指出,不推荐这种计算法,但是这个程序非常简单,在座的人都可以看懂,而且我们可以分享一下如何用英特尔的工具谁程序运行。大家看一下红颜色这一行代表的是质数化的数,从3开始,然四要对直属做验证之后,要看看这个数字是不是2的倍数。会通过循环测试确定某个数字因子是不是质数。左手有一个注资,有白颜色的3、5、7、9这样的数字,旁边的行谈到的是3除以7,5除以7,到7除以7的时候出现质数,就表成黄色。现在,我们已经了解到这个程序的结构,只是按照一个套路走的,Vtune可以帮助大家的很多忙,特别是在编程的起始,他可以帮助大家把整个思路进行思考。这个Vtune的截图从左侧开始,主要显示的是性能,上面这个性能谈到的是整个程序的运行时间。

  罗杰飞: 然后,做一个双击,就是在粗的蓝线中做了一个双击,看看这个结果。还有一个取样的截图,主要是看看程序的运行,看看周期时间,用的是编程当中的指令行,我们发现在环路当中得到的应该是以毫秒为单位,是10774个。然后,我们再做一个相除,来得到这个CPI的数字。这样我就知道了每个指令的周期数是6.7个,在这我们是做了一个相除。 在我们酷睿微架构中是有明显的流程取样的支持,有三个事件计数器,是和流水线相连的,在流水线发生的事件可以计数,事件计数器可以数出用了多少指令,采用多少周期,他们采用的是倒数的方法。比如说我每秒钟要想做1000个取样,并且要想让我机器的主频达到两千兆赫兹的话,我就可以相应的构建一个性能取样的截图。这个Vtune取样可以在任何程序上加以运行,来检查性能。 刚才我们看到了质数核心,在质数核心这我们花了大量的时间,希望运行速度能够更快,我下面会用英特尔的编译器,以及用我们的OpenMP,他是我们并行语言扩展,他是由我们高性能计算团体做的,这个团体在过去几年中做了大量的并行计算的研究,在英特尔公司OpenMP做了大量的工作,OpenMP就是说如果实现外环实现并行化,就是希望这个环路并行,OpenMP就会生成一个代码,这个代码可以声成两个线程,把一个环路变成两个环路,比如有10万个,把头五万分给第一个环,第二个五万分给第二个环,这两个环路并行的运行。如果不考虑同步的问题的话,速度理论上是快一倍。但是,我做运行的时候,并不是每次得到的结果都是一样的,这样就让我觉得是有缺陷的,让我觉得很沮丧。

  罗杰飞: 这是一个环路的并行性带来的,哪出错了呢?说明了我对质数的计数出现了错误,这有两个线程,每个线程做了质数的检测,都在实施质数,这两个环路都在各司其职,是好的。在C语言的构建当中,按照C语言的构建来说,这不仅仅是一个操作,这首先是从内存把值下下来,然后加以安装和运行,这实际上是三个操作。这样的情况就带来了一些我们无法察觉,或者尚未理解的一些现象的发生。所以说,有一个增量的数值在安装、实施和运营当中丢掉了。这就是我的理论,为了能够修改这样的现象,我希望我只让一个人,或者是一个线程来在一次实现质数的增量,这样能够避免刚才说的错误。OpenMP这样的语言,就有这样的一种添加的功能。只有一条线程在这个时候可以执行指令中的一行,对这个程序进行了这样的OpenMP改进以后,多次运行就能得到一样的结果了。 如果我的程序做的更大怎么办?或者是我找不到其中的问题何在怎么办?英特尔就此做了一个线程检测器帮助你们检查。如果运行在我这个质数上做一个运行的话,就带来了这张表上的结果,这个图实际上实现了线程1、线程2在运行什么,而且强调了这个红色的部分告诉我们问题何在。就出现了数据删除的情况。实际上是发现了三个数据删除的情况,标成了红色,这是因为装载存储反复运行过程中出现了问题。实际上我们的线程检查器可以帮助你进行这个分析,而不是要求你自己把整个程序做一个重新的分析找到问题。 它是如何工作的呢?简而言之,如果我有一个程序,把关键的部委进行检查,下面把这个程序进行一个调制,把所有的变量的锁定找到,然后通过这种算法,30年前开发出来的算法去追踪它的路线,然后在这个路线上做一个时间的框架。这样我们就能够找到,在引入新的数值时候的之前,之中和之后进行的情况。如果没有找到数据,我们就知道数据出现了错误,有数据风险。

  罗杰飞: 现在这个程序经过检查是好的程序,是没有问题的。现在我们看看这个程序是不是可以带来所需要的性能,我们要做一个性能的截图,我想知道在这个程序中是不是每一个线程都取得了进步,所以我通过我的线程配置图,这是一个酷睿的微架构,最后用了这个工具运行之后,就拿到了这张图。绿颜色代表的区域是并行运行的区域,粉红色的区域说明是在待命的线程,并不是说在等待同步,而是说粉红色这部分没有足够的工作来做,没有足够的工作负载。也就是说在两条线程之间工作没有得到均衡的分配,所以从性能上来说,我的速度就没有像我想象当中那么快。为什么会出现这样的情况呢?显而易见,我们用一只铅笔,一张纸就可以想到,就是在内环上我们用的时候是根据前面的环路得到的数字为基础的,就造成所有的小数都在一线程上,所有的大数字都在二线程上,这个二线程做的工作就多了。 下面,我把大数和小数在两个线程做一个均匀的分配,就可以解决这个问题,这个解决可以轻而易举的解决,而且有多种解决的方法。OpenMP有一个动态排期的功能,它能够动态的对两条线程进行多条线程工作的分配,这样能够实现工作负载的平衡。虽然我要再用一点性能进行排期,但是现在两条线程更加平衡,工作效率提高,这样可以达到我们的目的。大家看看这个程序运行需要多少时间,原来是10.7秒,现在已经是加快到5.3秒了。 然后,我们刚才看到介绍了英特尔推出的4种工具,VTune可以用来让我们了解我们程序的行为,做程序的分析。然后有C++编译器,然后有线程检测器,线程检测器能够帮助我们找到以前很难诊断的问题,然后是线程档案器,线程档案器是非常与众不同的,可以显示每一条线程的活动。 下面,我们看看如何把这些工具用到应用中呢?昨天在主旨演讲当中,我们有一个运动视频分析,清华大学的杨教授也上台给大家介绍了运动视频的处理。

  罗杰飞: 在这个视频当中,在这个项目中是对足球赛进行了分析,做了总结,把当中的精采场面做了提取,比如说射门、点球,对这些球迷来说。这是一个用户的界面,就是昨天展示的,基本上这个程序必须找到那些球员,而且要找到球,而且理解这个求才是怎么回事,规则等等,比如说进球是怎么回事。 这个程序是有一个高层的结构,如下所示,首先最上面的视频要进来,然后要听取一些特性,也就是说要总结一下每一针的情况,这一针的亮度怎么样等等,然后是中层,中层是确定和足球相关的事实,比如球在哪里,球是什么。最下面一层就是找到什么是进球,定义什么是顶球。这个性能,也就是这个程序上的时间是会越来越少,高层用的时间会非常多,所以我们今天主要看见组上面两层的情况。 现在,我们运行一下VTune,他要展示一张图,主要的图是我们称之为的加工针,然后我们把视频放进来,然后进行解码,然后我们要减少43%的运行时间,如果得到针以后,我们有56%多的时间用来提取特性。如果我们看到这个之后,这实际上有很多调用我们的函数库,这是一个很好的事情,因为这些例行的调用,对于我们英特尔多核来讲是非常适用的,这些C的编码在这里面可能需要进行一个调试和优化。但是,我以数据形式进行运行,我们看看热点在哪里,然后就显示出来这样的,一共有四个环路,每一个针都是一个正方形,有高度,有宽度,然后对于那些像素进行计算。像素这个问题计算量非常小,我们在这里只是取一个平均数就可以了。这种环路是完全对于并行来讲是非常完美的,我们要做的事情就是把这个路分成四部分,每个部分都要做一个部分的计算,然后加在一起,然后我们一开始上载的时候提取四个价值,把四个价值分别进行计算。英特尔的编译器可以帮助大家做到这一点,只要你给他把这个结构输入就可以了。

  罗杰飞: 另外一个编码的问题,就是把这个数据要放到数据缓存中,每一次处理一针,一针实际上有三个代表,它用RUV的编码,就是各种颜色的编码,有些算法是针对RGB,也是红绿蓝的颜色,另外一个算法是看灰度。 我在这里不是一个专家,如果我们用MPEG2的话,一个针的数量RUV是半G,RGB是两倍,灰度是四倍,总的来讲就是四兆以内,这不是很大的问题。但是,它的分辨率如果更高的话,就会更大,所以缓存又不够大了,我们RUV装进去了,RGB就装不进去,就会出现缓存限制的问题。为了对此进行加速,我们就要做一个缓存分化,也就是说对RUV我们处理意部分,然后直接给他这一部分的RUV转化成RGB,再转化成灰度,所以希望把我们的数据重组结构,这就需要一些实验,要进行访问,访问内存要比访问缓存更费劲,这个要最终由程序员提供这个解决方法。 如果大家考虑一下,我们属于对于单核进行调试的话,我们只要看看内部环路就可以,我们用一个矢量器做就可以了,然后把缓存分块就可以。如果我们进行平行计算的话,我们要看程序的外环,他要读取很多的,比如说视频等等这方面的数据,我们简单的方法是把视频他给切成几块,每一块都做一个线程,然后进行平行计算。这需要对于软件重新的重组结构,所有的例行任务可以同时在不同的针进行处理。而且线程的检查器可以帮我们做到这一点,一旦做到这一点之后,我们就在双核处理器上可以得到我们需要的性能。如果我们给他放到一个更多的并行计算的时候,可能会有些问题,特别是一个足球赛,因为每一个针并不是做同样的工作,可能有很多的屏幕上或者是针上没有什么动作,比如说暂停没有活动。因此,整个工作会不平衡的为什么最后要有一个平衡的平行计算?我们要解决这个负载不平衡的问题。我们在这里看的是内层循环并行的问题。如果我们不做这一点的话,程序就会变慢,这是令人失望的,这个原因在于我们所做的工作的单元是太小了。 在线程档案器中他就会显示这点,这是线程档案器另外一个界面,在多核处理器上我们可以看到,什么时候四核是有多么频繁,二核频繁的程度,一核的频繁的程度。

  罗杰飞: 它这下面就是看到了,就是显示发生的事情,就是说深绿色是单核活动的情况,蓝的就是分配工作的时间,你们可以看到分配工作的时间,实际上是做这个工作的四分之一。可以说在这方面管理的时间太高了,所以我们得不到这方面的速度,我们实际上花了太多的时间来建立并行预算。要避免这一点,我们就要在流程图上建立一个任务,在这里我们要回到VTune,我们要把这个任务拿出来,对视频进行解码,进行提取,做完了之后我们可以得到完全的并行计算,可以看到四核活跃的时间是最多的,现在我们就得到了并行运算的资料的好处。 基本上来讲,这样平行的战略,就是要做一些高层数据的处理,如果这还不够的话,我们要在每个中间找到一些任务,然后进一步的解决负载不平衡的问题。 刚才一直是讨论我们怎样能够把视频放在我们二核或者四核的机器,或者是八核的机器上面。昨天的时候,贾斯汀还提到了有个80核的机器,这是一个万亿附点级的,实际上是实验室做的一个原型,这是我们希望成为的一个样子,我们希望并行计算是可能要有60、80、100核的情况,我们如何做到这么一点,如何在这么多核上实现并行计算呢?我们做一个平行程序的时候,有一个安德道尔定律,就是运行时间等于上串行加上平行时间,如果好的办法就是尽可能增加平行时间,然后把平行时间尽可能并分。这个图显示出来,就是我们在不同的平行,或者说是不同的串行情况下得到多大的加速,比如说一半是串行的话,你可以得到两倍的加速,如果是10%的串行,你可以得到10倍的加速时间。如果说你需要得到64核的情况下,你需要的穿行时间减少到1%以下,这是非常有挑战性的任务。 我们英特尔就看到了新兴的一些软件应用,它们是非常平行计算的,他们可能用64位,他们有很多的种类,包括媒体的处理,比如说对个人数据的检索,还有一些商业数据检索,还有机器学习,还有等等其他的一些高级的算法等等。我们在实验室里一直做的事情,就是要创造一些有推动性的、虚拟的现实环境,这幅图是来自于一段视频,在这里没有照一张照片,比如脸是人工合成的,这个程序将模拟这个脸的活动的情况,尽可能以现实的方式。比如说一个东西掉到水里面,我们模拟水波的样子,现在我们可以这样做。比如说在《史莱克》这样的电影里面,或者是其他的动画片里面可以做到这一点。我们需要一个新的技术,使它更加有现实感。

  罗杰飞: 我们现在在双核机上,我们可以对每一针进行编辑,来达到这个效果。在这里面非常昂贵的部分不是说产生这些图片,而是物理方面的这些运动如何产生。我们要做一个网点,比如在水面上或者是脸上要做一个网格状的网,我们知道这些点在空间什么位置,然后我们要做一些等式,看这些点在真实环境下会如何移动,我们进行计算。如果我们能够使等式和现实相符的话,我们就会有很好的效果,我们的程序最终实际上就是要解决这些等式。在这里的外环是一个顺序的,所有的调用都是并行的,我们要对所有的因素,就是网格上的因素进行并行的计算。直到我们到很高的处理器的数字,比如说八核,比如说64核的有模拟器,我们还是要保证这样的扩展。扩展对于这些例行任务来讲并不是问题,每一个并行的例行的任务,这是一个函数,也就是要把这个工作分配给64个核,然后把64个核的结果汇总,再重新分配新的任务。这些实际上每一个调用都有这些串行的顺序,这样就会使系统的速度变慢,为了加速,我们做了一件非常简单的事情。我们看了看哪些线程,哪些调用是相互依赖的,然后把他们分组,比如说这样的话,我们可以有五个一组同时的分配工作,这样的话就会减少管理的时间,这是一个非常简单的事情。但是,这种事情未来的编译器需要做的这些事情,我们必须重视这件事情。

  罗杰飞: 在这里给大家展示一段视频,就是一个球掉进水里的视频。这不是用一个摄像机拍的,这是完全由计算机模拟的,这是一个虚拟的现实,它看上去非常真实。今天我们可以用电影做这些特级,未来的时候,你们在看你们的比赛,或者是做游戏的时候,或者是在你们的个人电脑上都可以做到这一点。看上去对于这种高度并行计算的机器现在有非常大的需求。 总结一下,刚才我们提到了并行计算,我们新的并行计算,我刚才介绍了英特尔的那些工具,比如说把程序进行映射,然后我们提到了一些具体的应用,还有一些未来的应用,我们刚才已经看到了,就是将发生的这些事情。我们在这里主要的一个信息,就是说软件要做更多的工作来利用多核的潜力,而英特尔现在提供了一些工具使这项工作更加的容易。

(责任编辑:梁冰)

我要发布

用户:  匿名  隐藏地址  设为辩论话题

*搜狗拼音输入法,中文处理专家>>

新闻 网页 博客 音乐 图片 说吧  
央视质疑29岁市长 邓玉娇失踪 朝鲜军事演习 日本兵赎罪
石首网站被黑 篡改温总讲话 夏日减肥秘方 日本瘦脸法
宋美龄牛奶洗澡 中共卧底结局 慈禧不快乐 侵略中国报告



说 吧更多>>

相 关 说 吧

罗杰飞

说 吧 排 行

茶 余 饭 后更多>>