如何在计算机体系结构中解决可扩展计算机的问题?
在任何可扩展的计算机系统中,需要解决两个基本问题:
容忍并隐藏远程加载的延迟。
容忍并隐藏由于并行处理器之间的同步而导致的空闲。
在使用某种形式的分布式内存的可扩展并行系统中,远程加载是不可避免的。访问本地内存通常只需要一个时钟周期,而访问远程内存单元可能需要长得多,时间上可能相差两个数量级。如果发出远程加载操作的处理器不得不等待操作完成,在此期间不做任何其他工作,则远程加载会显著降低计算速度。
由于大多数程序中的加载指令速率很高,延迟问题会消除并行活动的所有潜在好处。一个典型的例子如图所示,其中P0必须从两个远程内存块M1和Mn加载两个值A和B来计算表达式A + B。
A和B的指针分别为rA和rB,存储在P0的本地内存中。通过rload rA和rload rB指令访问A和B,这些指令必须通过互连网络来获取A和B。
如果rA和rB的值当前在M1和Mn中不可用,因为它们要由稍后运行的其他进程产生,情况会更糟。在这种情况下,由于并行进程之间的同步而导致空闲,原始进程P0必须等待不可预测的时间,从而导致不可预测的延迟。
为了解决这些问题,已经提出并应用于各种并行计算机中几种可能的硬件/软件解决方案:
应用缓存内存
预取
引入线程和线程之间快速的上下文切换机制。
如果大多数远程加载操作都可以在本地缓存上执行,则使用缓存内存可以大大减少远程加载操作所花费的时间。假设A与表达式中包含A的后续表达式中的对象C和D位于同一个缓存块中:
- Result:= A + B;
- Result2:= C – D;
在这种情况下,缓存A也会将C和D带入P0的缓存内存中,因此C和D的远程加载被本地缓存操作替换,从而导致程序执行速度显著加快。
预取技术依赖于类似的原理。其主要思想是在需要数据之前将其加载到本地内存或缓存中。预取操作是在发出实际内存操作之前,直接发出非阻塞请求来获取信息。
广告