并行程序设计导论 第二章习题

2.1 当讨论浮点数加法时,我们简单那地假设每个功能单元都花费相同的时间。如果每个取命令与存命令都花费2纳秒,其余的每个操作耗费1纳秒。 a 在上述假设下,每个浮点数加法要耗费多少时间? b 非流水线1000对浮点数的加法要耗费多少时间? c 流水线1000对浮点数加法要耗费多少时间? d 如果操作数/结果存储在不同级的内存层级上,那么取命令与存命令所要耗费的时间可能会差别非常大。假设从一级缓存上去数据/指令要耗费2纳秒,从二级缓存上取数据/指令要耗费5纳秒,从主存取数据/指令要耗费50纳秒。当执行某条指令,取其中一个操作数时,发生了一次一级缓存失效,那么流水线会发生什么情况?如果又发生二级缓存失效,又会怎样?

解答:

a 对照第17页的图,自行画一下就出来了,9纳秒

b 因为1000对要串行执行,所以9 * 1000 = 9000纳秒

c 这个可以画一下图,可能更有助与明白为什么这么算。1000 + (9 – 1) = 1008纳秒

d ① 因为指令会逐层查询,所以在一级缓存失效的时候,会去二级缓存中找,这样这次指令查找的时间为2+5=7纳秒。

② 假设这里的告诉缓存只有两级,这次指令查找的时间为2+5+50=57ns 对于整个流水线来说,只要这两次失效不在最后执行的几个任务上发生,那么对于整体的执行时间不会有影响。这个可以从第18页图中看出来。

2.2 请解释在CPU硬件里实现的一个队列,怎么使用可以提高直达高速缓存(write-through cache)的性能。

解答:

因为高速缓存的速度要比主存块很多,且写直达有一个特性就是,当CPU想Cache写数据时,高速缓存行会立即写入主存中。

2.3 回顾之前一个从缓存读取二维数组的示例。请问一个更大矩阵和一个更大的缓存是如何影响两队嵌套循环的性能的?如果MAX=8,缓存可以存储4个缓存行,情况又会是怎样的?在第一对嵌套循环中对A的读操作,会导致发生多少次失效?第二对嵌套循环中的失效次数又是多少?

解答:

① 当矩阵增大时,第一个嵌套循环的缺失次数要增加。

当缓存增大时,第一个嵌套循环的缺失次数会减少。 第二个嵌套循环在矩阵增大的情况下缺失次数会增多,当缓存达到一定程度的时候,才会出现缺失次数减少的情况。

② 这里假设每个缓存行可以存4个元素。

第一个循环一行有两次缺失的发生,所以2*8=16次 第二个循环一列有八次缺失的发生,所以8*8=64次

2.4 在表2-2中,,虚拟地址由12位自己偏移量和20位的虚拟页号组成。如果一个程序运行的系统上拥有这样页大小和虚拟空间,这个程序有多少页?

解答:

页的数量=2^20=1048576=1024k

2.5 在冯·诺依曼系统中加入缓存的虚拟内存改变了它作为SISD系统的类型吗?如果加入流水线呢?多发射或硬件多线程呢?

解答:

① 这里没有改变SISD的类型,这里只是对与数据的存储做了一定的处理,而没有对指令和数据的数量进行变动。

② 当加入流水线是属于指令级别的并行,所以当加入流水线时,系统的类型变为MISD。

③ 添加多发射和硬件多线程也是一样的,依旧是数据指令级别的并行,所以系统还是MISD。

2.6 假设一个向量处理器的内存系统需要用10个周期从内存载入一个64位的字。为了使一个载入流的平均载入时间为一个周期载入一个字,需要多少个内存体(memory bank)?

解答:

那这里就需要10个了。因为这里需要在一个周期内将64位的字进行载入,所以使用10个刚好能在一个周期内完成读取。当字的各个部分分布在不同的内存体中时,那么在装入/存储连续数据时能够几乎无延迟的访问,这样就能保证平均载入时间为一个周期的要求了。

2.7 请讨论GPU与向量处理器执行以下代码时的不同之处:

sum = 0.0;for (i = 0; i < n; i++){ y[i] += a*x[i]; sum += z[i]*z[i];}

解答:

① 因为向量处理器是单指令多数据的处理方式,所以对于上面的代码其可能会分为两个指令来执行。下面分解一下上面的代码,其中每一个循环代表着一个向量指令。

sum=0.0;for (i = 0; i < n; i++){ // loop 1 y[i] += a*x[i];}for (i = 0; i < n; i++){ // loop 2 sum += z[i]*z[i];}

通过这两指令来完成。 ②而GPU的处理方式就不大一样了,虽然书中没有提任何有关GPU计算的方式。不过就根据本人接触到的异构计算,GPU应该会这样做:

sum = 0.0 // host side// create a buffer for sum(host side)int _sum[n]={0};// the 1st GPU processor(device side){ y[0] += a*x[0]; sum[0] += z[0]*z[0];}// the 2ed GPU processor(device side){ y[1] += a*x[1]; sum[1] += z[1]*z[1];}…// the n th GPU processor(device side){ y[n-1] += a*x[n-1]; sum[n-1] += z[n-1]*z[1];}//hostsum= sum[0]+sum[1]+…+sum[n-1]; // (host side)

这样就可以看出两者的差别了吧。GPU是将每个计算分解成一个任务,让一个GPU处理器来完成,所以这里GPU的方式类似与SIMD,但也如书中所写,GPU不是纯粹的SIMD系统。

2.8 如果硬件多线程处理器拥有大缓存,并且运行多个线程,请解释为何改处理器的性能会下降。

解答:

这里和大缓存的关系并不大,重要的影响是来自于多个线程。因为在硬件多线程处理器中,当前任务需要等待数据从内存中读出,那么它可以通过执行其他线程而不是继续当前线程来发掘并行性。所以就需要支持线程间的快速切换,当切换速度过慢且线程的数量过多的情况下,性能自然会下降。

2.9 在关于并行硬件的讨论中,用Flynn分类发来识别三种并行系统:SISD、SIMD和MIMD。我们讨论系统中没有多指令单指令流单数据系统,或称为MISD系统。那么,MISD系统是如何工作的呢?请举例说明。

解答:

从名字上就能看出来,对于单个数据,进行不同的指令操作。比如,处理器取到了一个数据,在同一时间对这个数据进行乘和减的操作。这样的系统没有存在的意义,其功能完全可以由SIMD或MIMD进行替换。

孜孜不倦的追求奋斗,加油。

并行程序设计导论 第二章习题

相关文章:

你感兴趣的文章:

标签云: