- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
高性能计算导课件高性能第一章PPT
分析比较 在8个核的情况下,第一种方法中,master核需要执行7次接收操作和7次加法 第二种方法中,master核仅需要执行3次接收操和3次加法 第二种方法比第一种方法快2倍! 分析比较(续) 当有更多的核时,两者的差异更大。 在1000个核的情况下,第一种方法需要999次接收和加法操作,而第二种方法只需要10次,提高了100倍。 非常明显,第一种计算全局总和的方法是对串行求和程序的一般化:将求和的工作在核之间平分,等到每个核都计算出部分和之后,master简单地重复串行程序中基本的串行求和。而第二种计算全局总和的方法与原来的串行程序没有多大关系。 并行程序设计 为什么需要不断提升的性能 为什么需要构建并行系统 为什么需要编写并行程序 怎样编写并行程序 怎么编写并行程序 任务并行 将待解决问题所需要执行的各个任务分配到各个核上执行. 数据并行 将待解决问题所需要处理的数据分配给各个核. 每个核在分配到的数据集上执行大致相似的操作. 例子 15 个问题 300 份试卷 3个助教 数据并行 TA#1 TA#2 TA#3 100 exams 100 exams 100 exams 任务并行 TA#1 TA#2 TA#3 Questions 1 - 5 Questions 6 - 10 Questions 11 - 15 求和例子的第一部分——数据并行 数据是通过Compute_next_value计算得到的值,每个核在所赋予的数据集上执行大致相同的操作:通过调用Compute_next_value获取所需的数据,再将数据累加求部分和。 求和例子的第二部分——任务并行 总共有两个任务:一个任务由master核执行,负责接收从其他核传来的部分和,并累加部分和; 另一个任务由其他核执行, 负责将自己计算得到的部分和传递给master核。 第一章的课堂练习 练习1. 为求全局总和例子中的my_first_i和my_last_i推导一个公式。需要注意的是:在循环中,应该给各个核分配数目大致相同的计算元素。 quotient = n / p; remainder = n % p; if (my_rank remainder) { my_n_count = quotient + 1; my_first_i = my_rank * my_n_count; } else { my_n_count = quotient; my_first_i = my_rank * my_n_count + remainder; } my_last_i = my_first_i + my_n_count - 1; 练习2 尝试写出树形结构求全局总和的伪代码。假设核的数目是2的幂(1、2、4、8等)。提示:使用变量divisor来决定一个核应该是发送部分和还是接收部分和,divisor的初始值为2,并且每次迭代后增倍。使用变量core_difference来决定哪个核与当前核合作,它的初始值为1,并且每次迭代后增倍。例如,在第一次迭代中0 % divisor = 0,1? % divisor = 1,所以0号核负责接收和,1号核负责发送。在第一次迭代中0 + core_difference = 1,1-core_difference = 0,所以0号核与1号核在第一次迭代中合作。 divisor = 2; core_difference = 1; sum = my_value; while ( divisor = number of cores ) { if ( my_rank % divisor == 0 ) { partner = my_rank + core_difference; receive value from partner core; sum += received value; } else { partner = my_rank - core_difference; send my sum to partner core; } divisor *= 2; core_difference *=2; } 练习3 作为前面问题的另一种解法,可以使用C语言的位操作来实现树形结构的求全局总和。为了了解它是如何工作的,写下核的二进制数编号是非常有帮助的,注意每个阶段相互合作的成对的核。 从表中我们可以看到在第一阶段,每个核与其二进制编号的最右位不同编号的核配对,在第二阶段与其二进制编号的最右第二位不同编号的核配对,第三阶段与其二进制编号的最右第三位不同编号的核配对。因此,如果在第一阶段有二进制掩码(bitmask)0012
文档评论(0)