我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:六合特码 > 多处理器分配 >

片上多核处理器共享资源分配与调度策略研究综述(二)

归档日期:05-24       文本归类:多处理器分配      文章编辑:爱尚语录

  在CMP 系统中,一级缓存通常是私有的,而最后一级缓存(last level cache,LLC)则在各个核间

  共享缓存使得多个线程可以共享某些数据,降低通讯延迟,同时减少数据的冗余备份,提高缓存空间利用率。但是,线程间对于有限共享缓存空间的争夺,也会导致缓存失效率的上升,影响系统的吞吐量和公平性。

  在单核单线程处理器中最为常用的缓存替换算法是LRU.LRU 不区分访存请求的线程来源,同等对待所有访存请求,每次发生缓存失效时替换最近最少访问的缓存块。LRU 在单线程环境中能够有效地提高缓存利用率。然而,在多线程环境下,由于线程间对于共享缓存空间的争夺,仍然采用LRU 算法的话,一个频繁发生缓存失效的线程(例如,流媒体应用)会不公平地替换掉其他线程的有用数据块,占用大量乃至全部缓存空间,从而导致其他线程的缓存失效率(MissRate)①大幅上升,破坏系统的公平性;另外,一个产生大量缓存失效的线程,其数据的复用率(reused)可能很低,而其他线程被替换掉的却可能是一些常用数据,从而降低了共享缓存的利用率,导致总的缓存失效率上升。无论哪种情况,最终结果都会使得系统的性能受到严重影响。

  为了降低线程间争夺缓存空间带来的影响,一种直观的想法是对缓存进行分区,通过明确地把缓存空间分配给各个核来避免线程间的干扰。一旦某部分缓存被划分给某个线程,由该线程独享这部分缓存空间,其他线程无权替换这部分缓存空间中的数据,避免了由于缓存争夺所带来的额外缓存失效,使得所有线程的请求都能够得到合理服务。缓存分区之后,对单个线程而言,相当于运行在单线程环境中一样,因此,在各缓存分区内可以仍然采用LRU算法。

  最简单也最容易实现的的缓存分区方式是在程序运行前将缓存平均划分给CMP 系统中的各个核,称之为静态分区。但这种做法的缺点是明显的,不同线程对于缓存空间需求不一样,并且即使同一个线程在不同的执行阶段对缓存空间的需求也可能不一样,而静态分区策略不能有效反映这种情况。部分线程可能划分到超出需求的缓存空间,导致缓存空间的浪费,而另一部分线程对于缓存空间的需求却没有得到满足。静态缓存分区策略实际上是把二级缓存当做了各个处理器的一级私有缓存的扩充,失去了多核共享缓存所能带来的好处。近年来的大量研究中都不再采用静态分区策略。

  显然,只有知道各线程的具体访存行为特征和缓存需求,才能作出最优的缓存分区决策。制定一个公平有效的缓存分区策略,需要一个明确的性能优化目标,并且根据线程所处的具体执行环境与执行阶段,充分利用线程访存行为的动态特征。在共享缓存分区中用到的程序动态特征一般指线程在划定不同大小的缓存空间下所对应产生的缓存失效率。

  动态缓存分区策略的优化目标一般包括两类,吞吐量和公平性。吞吐量是针对系统的整体性能而言。对于动态缓存分区策略,一个常用的评估吞吐量的指标是共享缓存产生的总缓存失效率,通过最小化缓存失效率达到最大化系统吞吐量的目标;同时,缓存失效率低,意味着处理器核等待数据返回的阻塞等待时间减少,提交指令的速度更快,因此,另一个与系统吞吐量相关的指标是IPC(instructiONsper cycle)。公平性则是指系统中并行运行的多个线程能够公平的使用共享缓存,不会存在某些线程占有大部分缓存空间,导致其他线程的缓存失效率大幅增长,性能受到重大影响;公平性同时关注系统中的每个线程,尽量保证所有线程的服务质量得到同等程度的改善。

  基于不同的性能优化目标,提出的缓存分区策略通常有很大分别。Hsu 等人在其相关研究中即根据优化目标的不同,命名了3 类调度策略:第1类缓存调度策略可称为“capitalist”,该类策略对于各线程的访存请求无限制,任其自由争夺共享资源,“适者生存”,最为常见的即为通用的LRU 替换策略,但是这类调度策略在多线程环境下通常对于系统的吞吐量和公平性都有影响;第2 类是以最大化系统吞吐量为优化目标的“utilitarian”,该类策略忽视公平性,无法保证单个线程的性能表现;最后一类是以系统公平性为目标的“communist”,该类策略尽量确保并行执行的各线程的服务质量得到同等程度的改善,不会有某些线程的性能受到严重影响。

  在现代商业通用处理器上通常有用于计算系统总缓存失效率的部件,但是制定动态缓存分区策略需要更详细地知道各个线程的访存特征信息。一些特别用于获取线程访存行为特征的辅助硬件是必要的,本文将在1.3.1 节中给出相关介绍。

  在取得必需的访存信息后,即可以根据不同的优化目标制定相应的缓存分区策略,在1.3.2 节和1.3.3 节中将分别从追求最大化吞吐量和公平性的角度对缓存分区进行研究。在1.3.4 节则针对缓存分区粒度过大(通常是按路分区)的问题介绍了一些解决方案。

  大多数商业通用处理器都有一个硬件缓存监控器。缓存监控器包括两类计数器,一类用于计数系统总的访存数,另一类计数系统总的缓存失效数,由此可以计算出系统的缓存失效率。但如前所述,要制定动态缓存分区策略,还需要一些特别的辅助硬件来获取各个线程访存行为的特征信息。对于缓存分区而言,线程在各种可能的缓存空间下对应产生的缓存失效率是一个极其有用的信息。一种简单的做法是把每个线程在各种缓存配置下分别执行一次以获取相应缓存失效率。显然,这种方法过于低效,没有实用性。

  当多个线程并行运行时,为了在不实际改变缓存配置的前提下,获取各线程在不同缓存空间对应的缓存失效率,Hsu 等人在文献[2-3]中提出一种访存监控器(memory monitor,MON)。对于N 路组相联缓存,每个MON 有N 个路计数器(way-counter)。

  这组路计数器根据线程对缓存各路的使用情况按照LRU 次序排列。当对一个MRU(most recently used)缓存路中的缓存行发生缓存命中时,counter(0)增加1;当对一个LRU 缓存路中的缓存行发生缓存命中时,counter(N-1)增加1,以此类推。MON 另有一个计数器用于计数一个线程对共享缓存的总访存次数。

本文链接:http://ticketsareus.net/duochuliqifenpei/469.html