运行得快!!!
串行问题的处理方法
将串行程序改写为并行程序
编写一个翻译程序来自动地将串行程序 翻译成并行程序
非常困难 鲜有突破
更多的问题
尽管我们可以编写一些程序,让这些程序辨识 串行程序的常见结构,并自动将这些结构转换 成并行程序的结构,但转化后的并行程序在实 际运行时可能很低效
一个串行程序的高效并行实现可能不是通过发 掘其中每一个步骤的高效并行实现来获得,相 反,最好的并行化实现可能是通过一步步回溯 ,然后发现一个全新的算法来获得的
总线——指令和数据通过CPU和主存之间 的互连结构进行传输。这种互连结构通 常是总线,总线中包括一组并行的线以 及控制这些线的硬件。
例如,假如有8个核,n=24,24次调用 Compute_next_value获得如下的值:
1,4,3, 9,2,8, 5,1,1, 5,2,7, 2,5,0, 4,1,8, 6,5,1, 2,3,9
例子(续)
当各个核都计算 完各自的 my_sum值后, 将自己的结果值 发送给一个指定 为“master”的 核(主核), master核将收 到的部分和累加 而得到全局总和
求和例子的第二部分——任务 并行
总共有两个任务:一个任务由master核执行,负责接收从其他核传来的 部分和,并累加部分和; 另一个任务由其他核执行, 负责将自己计算得 到的部分和传递给master核。
第一章的课堂练习
练习1. 为求全局总和例子中的 my_first_i和my_last_i推导一个公式 。需要注意的是:在循环中,应该 给各个核分配数目大致相同的计算 元素。
练习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号核在第一次迭代中合作。