CyRhmU.jpeg
查看: 1469  |  回复: 6
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

zouming1979

捐助贵宾 (小有名气)

[交流] 多核和应用性能的关系已有3人参与

由于功耗的原因,处理器的主频难以提升,因此目前处理器的发展主要在两个方面,一个是单核内部架构的优化,提高计算过程中效率,一个是在单一的处理器中增加更加多的核心,通过并行提高性能。目前架构的优化经过这几年的大发展,已经有相当大的提升,在可预见的一段时间内,暂时还看不到能带来有显著的效率提升的架构变化;而核心数可以在预见的一段时间内有大的提升,包括GPU结构、多核结构、众核结构等。因此并行将是未来几年性能提升的最大来源,但是应用是否能够得到这种收益,主要是看应用类型和应用软件优化能力。

先讲讲并行计算中,一个非常著名但是又是非常简单和易于理解的定理---阿姆达定律
阿姆达定律讲的是这么一件事:一个程序存在两部分,只能串行计算的部分S,和能够并行计算地部分P。两部分之和是整个程序,因此S+P=1。这个程序如果在一个具有N个核心的处理器上运行,那么和它在一个单核处理器上运行相比,速度的提升是1/(S + P/N)。当N趋近于无穷大时(即假设我们有无穷多个核心),速度提升的上限是1/S,即速度提升的上限取决于程序不能被并行计算的部分。
现在的多核处理器还远远没到拥有1,000个核心的时候。然而未来的某一天,不管是软件还是硬件工程师们也许会满头大汗地向客户解释这个问题:为什么最新的1,000核处理器比旧的100核处理器快不了多少?

阿姆达定律描述的是理想情况,在实际应用中并行化是有代价的,有的时候是不能被忽略,当N趋于无穷大时,大多时候不但不能导致并行部分的时间趋于零,反而导致并行部分时间变大。
并行计算部分的代价可以分为两个部分
1.        算法被并行,对算法的修改会增加了总计算量(几乎所有的并行算法)
2.        通信的代价和数据同步带来的开销。
举个例子:矩阵乘法的并行化,需要将两个相乘的矩阵划分为多个子矩阵。子矩阵乘完之后,需要在各个节点之间交换数据。通过网络发送子矩阵的结果这个是通讯代价;进行下一步计算,需要等待所需的数据到了(有时候要等待多个进程发送来的数据),这个是数据同步。

通信延迟隐藏是并行优化最常用的手段之一,即一边计算一边传输数据
a)        计算出部分结果后,就开始传送数据
b)        数据一发送(不等发送完毕),就直接开始下一步计算(要设计算法,才能保证这个地方不会因为同步导致不能计算)

当并行化之后,当一个确定的应用和一个确定大小的数据集。
并行度越高 =>子矩阵越小=>计算的时间就越短
子矩阵越小=>传输时间并不成比例缩小(传输有启动时间,不会无限小)
子矩阵越小=>传输的次数越多=>同步次数越多

     当计算时间越来越小,比通信时间还小的话,就不能掩盖通信延迟,而且会提高通信代价和同步代价。因此当并行度越高,加速比就会越来差,直到最后,反倒会下降。

     看到这里,我们如何提高并行应用的性能?
1.        降低串行部分的执行时间 => 高速处理器
2.        降低通信代价  => 高速网络(延迟在大多时候比带宽重要)
3.        合理的并行度


下面对一个真实案例进行分析
     用ADF对某个分子体系进行模拟进行分子模拟(本人完全不懂分子模拟,以下分析不涉及领域知识)

这个是ADF官方的一个数据,从上面的这个曲线可以明显看出,当核数比较少的时候,这个应用的加速比非常的好
50个核并行时,总执行时间2000秒左右
100核并行时, 总执行时间比1000秒稍多点
超过100核之后,加速比明显降低,到200核(750s左右)之后性能提升就比较慢,300-400核时的,执行时间也超过500秒。


同样一个案例,在我们的计算环境下,测试出来的数据。
12核时,执行时间1000秒左右
24核时,执行时间520秒
36核时,执行时间380秒
120核时,执行时间低于300秒。

当计算和通信比基本达到平衡状态,再增加核数,导致并行计算部分进一步缩小后,计算和通信比开始不平衡,导致通信时间无法再隐藏了。从两个不同的平台中可以看出,当一个应用的数据规模确定后,一个应用的运行速度极值变化远比平台性能提升的少(在扩展性较好的应用)。

选择一个合适的并行度,既可以提升执行的速度,又不对资源过多的浪费,怎么选择并行度也是多方面的考虑,速度优先还是效率优先?
     自己的机器估计还是速度优先(资源够的话)
     如果用的是收费资源可能还是效率优先。

选择并行度也是是需要有相当的经验,可能大多数情况下,都需要做实验,有经验的会更快找到平衡点。

另外从不同的平台的性能对比,其实也说明,不同的核,性能差距实在太大,核多看起来很美,但是谁用谁知道。
一个平台的100核的效果还比不上另外一个平台12核的效果。花了太多的时间在优化,还不如直接换个平台更加省事和彻底。

搭建平衡的系统,也非常关键,说起来容易,其实做起来也太容易。
因为数据不太全,也不能做个很深入的对比。大家先凑合着看吧,有机会可以再讨论讨论。

[ Last edited by zouming1979 on 2012-5-1 at 20:54 ]
回复此楼

» 收录本帖的淘帖专辑推荐

并行计算

» 本帖已获得的红花(最新10朵)

» 猜你喜欢

» 本主题相关商家推荐: (我也要在这里推广)

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

uuv2010

荣誉版主 (职业作家)

优秀版主


小木虫: 金币+0.5, 给个红包,谢谢回帖
引用回帖:
另外从不同的平台的性能对比,其实也说明,不同的核,性能差距实在太大,核多看起来很美,但是谁用谁知道。

从哪几个主要性能评价计算性能比较合适?多谢!
4楼2012-05-02 09:43:07
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 7 个回答

huangll99

木虫 (职业作家)

学习

多机并行和多核(同机)并行差在哪里?

[ Last edited by huangll99 on 2012-5-1 at 11:10 ]
2楼2012-05-01 11:07:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zouming1979

捐助贵宾 (小有名气)

★ ★
fzx2008: 金币+2, 谢谢指教 2012-05-01 21:31:14
多机并行,基本都采用基于消息传递的机制MPI,在程序中显示的发送和接收消息。这个是通过网络设备将数据发出去,延迟和带宽都受到网络设备的限制。
同机并行(节点内并行)可以采用MPI通信,也可以采用openmp(自动多线程技术),采用多线程进程,由于一个进程内的地址空间是共享的,多个线程之间的数据传递可以通过共享内存的机制(必须加上锁,避免多个线程同时读写数据,造成数据不一致),直接在内存中传递,延迟可以极大的降低,带宽也可以极大的增加。

节点内如果采用MPI通信,如果使用优化的MPI库,也可以被自动在内存中传递,减小开销。

» 本帖已获得的红花(最新10朵)

3楼2012-05-01 11:22:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huangll99

木虫 (职业作家)

送鲜花一朵
引用回帖:
3楼: Originally posted by zouming1979 at 2012-05-01 11:22:18:
多机并行,基本都采用基于消息传递的机制MPI,在程序中显示的发送和接收消息。这个是通过网络设备将数据发出去,延迟和带宽都受到网络设备的限制。
同机并行(节点内并行)可以采用MPI通信,也可以采用openmp(自 ...

多谢指教
5楼2012-05-02 10:34:48
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 高级回复(可上传附件)
信息提示
请填处理意见