3.3.5 DMA写时发生Cache命中的优化

在许多高性能处理器中,还提出了一些新的概念,以加速外设到存储器的DMA写过程。如Freescale的I/O Stashing和Intel的IOAT技术。

如图3?8所示,当设备进行存储器写时,如果可以对Cache直接进行写操作时,即便这个存储器写命中了一个状态为M的Cache行,可以不将该Cache行的数据回写到存储器中,而是直接将数据写入Cache,之后该Cache行的状态依然为M。采用这种方法可以有效提高设备对存储器进行写操作的效率。采用直接向Cache行写的方法,PCI设备对存储器写命中一个状态为M的Cache行时,将执行以下操作。

(1)      HOST主桥将对存储器的写请求发送到FSB总线上。

(2)      CPU通过对FSB监听,发现该写请求在某个Cache行中命中,而且该Cache行的状态为M。

(3)      HOST主桥将数据直接写入到Cache行中,并保持Cache行的状态为M。注意此时设备不需要将数据写入存储器中。

从原理上看,这种方法并没有奇特之处,仅需Cache能够提供一个接口,使外部设备能够直接写入即可。但是从具体实现上看,设备直接将数据写入Cache中,还是有相当大的难度。特别是考虑在一个处理器中,可能存在多级Cache,当CPU进行总线监听时,可能是在L1、L2或者L3 Cache中命中,此时的情况较为复杂,多级Cache间的协议状态机远比FSB总线协议复杂的多。

在一个处理器系统中,如果FSB总线事务在“与FSB直接相连的Cache”中命中时,这种情况相对容易处理;但是在与BSB(Back-Side Bus)直接相连的Cache命中时,这种情况较难处理。下文分别对这两种情况进行讨论,在一个处理器中,采用FSB和BSB连接Cache的拓扑如图3?9所示。

当采用FSB总线连接L2 Cache时,L2 Cache直接连接到FSB总线上,设备通过FSB总线向L2 Cache进行写操作并不难实现,MPC8548处理器就是采用了这种结构将L2 Cache直接连接到FSB总线上。

但是由于FSB总线的频率远低于BSB总线频率,因此采用这种结构将影响L2 Cache的访问速度,为此高端处理器多采用BSB总线连接L2 Cache,x86处理器在Pentium Pro之后的高性能处理器都使用BSB总线连接L2 Cache,Freescale的G4系列处理器和最新的P4080处理器也使用BSB总线连接L2 Cache。

当L2 Cache没有直接连接到FSB上时,来自外部设备的数据并不容易到达BSB总线。除了需要考虑Cache连接在BSB总线的情况外,在外部设备进行DMA操作时,还需要考虑多处理器系统的Cache共享一致性协议。设计一个专用通道,将数据从外部设备直接写入到处理器的Cache中并不容易实现。Intel的IOAT和Freescale的I/O Stashing可能使用了这种专用通道技术,直接对L1和L2 Cache进行写操作,并在极大增加了设计复杂度的前提下,提高了处理器系统的整体效率。

以上对Cache进行直接写操作,仅是Intel的IOAT和Freescale的I/O Stashing技术的一个子集。目前Intel和Freescale没有公开这些技术的具体实现细节。在一个处理器系统中,可能存在多级Cache,这些Cache的层次组成结构和状态机模型异常复杂,本章对这些内容不做进一步说明。

时间: 2024-10-04 17:40:20

3.3.5 DMA写时发生Cache命中的优化的相关文章

3.3.4 PCI设备进行DMA写时发生Cache命中

如果PCI设备访问的地址在某个CPU的Cache行中命中时,可能会出现三种情况. 第一种情况是命中的Cache行其状态为E,即Cache行中的数据与存储器中的数据一致:而第二种情况是命中的Cache行其状态为S.其中E位为1表示该数据在SMP处理器系统中,有且仅有一个CPU的Cache中具有数据副本:而S位为1表示在SMP处理器系统中,该数据至少在两个以上CPU的Cache中具有数据副本. 当Cache行状态为E时,这种情况比较容易处理.因为PCI设备(通过HOST主桥)写入存储器的信息比Cac

指针-写入位置时发生访问冲突。自己写了个函数用来读取device中的数据至OMEGA中 调用时报错

问题描述 写入位置时发生访问冲突.自己写了个函数用来读取device中的数据至OMEGA中 调用时报错 OMEGA=ReadtoOMEGA(temp_data,OMEGA,width,num_pixels,bands,e1,count_Duanyuan); float * ReadtoOMEGA(void const * const device,float * OMEGA,size_t const width,size_t const num_pixels,size_t const bands

连接ACCESS数据库时发生错误提示:找不到可安装的 ISAM

连接ACCESS数据库时发生错误提示:找不到可安装的 ISAM 检查后发现原来是把Data Source写成 DataSource了 错误:<add key="OleConnection" value="Provider=Microsoft.Jet.OleDb.4.0;DataSource=Demo.mdb;" /> 正确:<add key="OleConnection" value="Provider=Microso

reference counting:PHP源码分析-变量的引用计数、写时复制(Reference counting &amp;amp; Copy-on-Write)

PHP语法中有两种赋值方式:引用赋值.非引用赋值.<?php$a = 1;$b = $a; // 非引用赋值$c = &$b; // 引用赋值从表面看,通常会这样认为:"引用赋值就是两个变量对应同一个变量(在C中其实就是一个zval),非引用赋值则是直接产生的一个新的变量(zval),同时将值copy过来".这种认为在大部分情况下都是可以想通的.(#1)但有些情况下则会显得非常低效,例如:(#2)<?phpfunction print_arr($arr){//非引用

webservice调用失败:基础连接已经关闭,接受时发生错误

问题描述 c#写的webservice,提供接口函数A,此函数后台调用c++写的dll读取服务器上的文件,当文件比较大时,该函数比较耗时,发现当耗时大概达到10秒时,程序就会报"基础连接已经关闭,接受时发生错误".服务器是阿里云(winserver2008,64位),iis7.5.请问是什么原因? 解决方案 解决方案二:超时了????解决方案三:web.config中加入或者修改<httpRuntimeexecutionTimeout="number(inseconds

指针-为何c语言中会出现读取位置时发生访问冲突

问题描述 为何c语言中会出现读取位置时发生访问冲突 我是写字符串检索.但是如果把jiansuo()这个函数中第二个if(cha(p2)==(p3-p2+1))的话就没问题了.也就是说后边不能==i,如果是i的话,就出错-- #include int cha(char *p1) { int num=0; for (char *p = p1; *p!= ''; p++) { num++; } return num; } void jiansuo(char *p1,char *p2) { for (c

对链表头写入next,一直显示0xC0000005: 写入位置 0x00000068 时发生访问冲突

问题描述 对链表头写入next,一直显示0xC0000005: 写入位置 0x00000068 时发生访问冲突 代码如下 #include #include #define ElementType int typedef struct Node{ int Data; struct Node *Next; } List; List L, *PtrL; void Listinput(List *ptrL,int max) { long int i,next_temp,l_temp; int data

namespace-在ssh整合时,使用struts2注解时发生以下错误

问题描述 在ssh整合时,使用struts2注解时发生以下错误 2015-7-14 20:22:47 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn警告: Could not find action or resultThere is no Action mapped for namespace / and action name customerAction. - [unknown location] at com

PHP中copy on write写时复制机制介绍_php技巧

什么是写时复制(Copy On Write)? 答:在复制一个对象的时候并不是真正的把原先的对象复制到内存的另外一个位置上,而是在新对象的内存映射表中设置一个指针,指向源对象的位置,并把那块内存的Copy-On-Write位设置为1.这样,在对新的对象执行读操作的时候,内存数据不发生任何变动,直接执行读操作:而在对新的对象执行写操作时,将真正的对象复制到新的内存地址中,并修改新对象的内存映射表指向这个新的位置,并在新的内存位置上执行写操作. 这个技术需要跟虚拟内存和分页同时使用,好处就是在执行复