当发生缓存未命中时,CPU会将整个缓存线从主内存提取到缓存层次结构中。(x86\u 64上通常为64字节)
这是通过数据总线完成的,在现代64位系统上,数据总线只有8字节宽。(因为字大小是8字节)
编辑:“数据总线”在此上下文中是指CPU芯片和DRAM模块之间的总线。此数据总线宽度不一定与字大小相关。
根据策略,首先获取实际请求的地址,然后依次获取缓存行的其余部分。
如果有一个64字节宽的总线,它似乎会快得多,这将允许一次获取整个缓存行。(这将是字大小的八倍)
可能有两种不同的数据总线宽度,一种用于标准缓存线提取,另一种用于仅用于字大小内存访问的外部硬件(DMA)。
限制数据总线大小的限制有哪些?
我认为存在物理/成本问题。除数据行(64)外,还有地址行(15)和银行选择行(3)。加上其他线路(CS、CAS、RAS…)。例如,请参阅第6代Intel®Core™ 处理器系列数据表。一般来说,一辆公共汽车大约有90条线路,两辆公共汽车大约有180条线路。还有其他线路(PCIe、延迟播放…)下一个方面是突发读取。使用bank\u选择
我们可以从8个银行中选择一个。在突发模式下,在所有银行写入一个地址时,我们按每个银行的刻度读取所有银行的数据。
我认为DRAM总线宽度在AMD64之前扩展到了当前的64位。它与单词大小匹配,这是一个巧合。(P5奔腾已经保证了64位对齐传输的原子性,因为它可以通过64位数据总线轻松实现。当然,这只适用于x87(以及更高版本的MMX)在32位微体系结构上的加载/存储。)
请看下面:高带宽内存确实使用更宽的总线,因为您可以在多高的位置进行时钟处理是有限制的,并且在某些时候,使其大规模并行确实变得有利。
如果有64字节宽的总线,它似乎会快得多,这将允许一次获取整个缓存行。
突发传输大小不必与总线宽度相关。与DRAM之间的传输确实发生在缓存线大小的突发中。CPU不必为每个64位发送单独的命令,只需设置整个缓存线的突发传输(读或写)。如果它想要的更少,它实际上必须发送一个中止突发命令;没有“单字节”或“单字”传输命令。(是的,SDRAM wiki文章仍然适用于DDR3/DDR4。)
您是否认为需要更宽的总线来减少命令开销?他们不是。(SDRAM命令通过与数据分离的管脚发送,因此命令可以通过管道传输,在当前突发传输期间设置下一个突发。或者在另一个银行或芯片上打开新行(dram页)时更早开始。DDR4 wiki页面有一个很好的命令图表,显示了地址引脚对某些命令的其他含义。)
高速并行总线很难设计。主板上CPU插槽和每个DRAM插槽之间的所有记录道必须在小于1个时钟周期内具有相同的传播延迟。这意味着它们的长度几乎相同,并且控制其他记录道的电感和电容,因为传输线效应在足够高的频率下非常关键,因此非常有用。
极宽的总线会阻止您将其计时为高,因为您无法实现相同的公差。SATA和PCIe都用高速串行总线取代了并行总线(IDE和PCI)。(PCIe并行使用多条通道,但每条通道都是自己独立的链路,而不仅仅是并行总线的一部分)。
从CPU插座到DRAM插座的每个通道使用512条数据线是完全不切实际的。典型的台式机/笔记本电脑CPU使用双通道内存控制器(因此两个DIMM可以同时做不同的事情),因此主板上有1024条迹线,CPU插座上有引脚。(这位于固定数量的控制线之上,如RAS、CAS等。)
以很高的时钟速度运行外部总线确实会有问题,所以在宽度和时钟速度之间需要权衡。
有关DRAM的更多信息,请参阅Ulrich Drepper的《每个程序员都应该了解的内存》。它对DRAM模块、地址线和mux/demuxers的硬件设计具有惊人的技术性。
请注意,RDRAM(RAMBUS)使用高速16位总线,带宽高于PC-133 SDRAM(1600MB/s vs.1066MB/s)。(它的延迟更差,运行更热,并且由于一些技术和非技术原因在市场上失败了)。
我想它有助于使用更宽的总线,直到您可以在一个周期内从物理DRAM芯片读取的宽度,因此您不需要太多的缓冲(较低的延迟)。
乌尔里希·德雷珀的论文(见上图)证实了这一点:
然后,基于地址线a2和a3,一列的内容可用于DRAM芯片的数据引脚。这在多个DRAM芯片上并行发生多次,以产生与数据总线宽度相对应的总位数。
在CPU内部,总线要宽得多。Core2到IvyBridge在不同级别的缓存之间以及从执行单元到L1之间使用128位数据路径。哈斯韦尔将其拓宽至256b(32B),L1和L2之间有64B路径
高带宽内存被设计成与控制它的任何东西更紧密地耦合,并且每个通道使用128位总线,有8个通道。(总带宽为128GB/s)。HBM2速度加倍,宽度相同。
8通道128b不是一个1024b总线,而是一个很难保持同步的极宽总线与每个位在单独通道(如PCIe)上的开销太大之间的权衡。如果您需要强大的信号和连接器,单独通道上的每一位都很好,但是当您可以更好地控制事物时(例如,当内存没有插槽时),您可以使用宽的快速总线。
可能有两种不同的数据总线宽度,一种用于标准缓存线提取,另一种用于仅用于字大小内存访问的外部硬件(DMA)。
情况已经如此。DRAM控制器集成到html" target="_blank">CPU中,因此来自系统设备(如SATA控制器和网卡)的通信必须通过一条总线(PCIe)从它们传输到CPU,然后再传输到RAM(DDR3/DDR4)。
从CPU内部内存体系结构到系统其余部分的桥接称为系统代理(这基本上取代了在没有集成内存控制器的系统中,主板上曾经是一个单独的北桥芯片)。芯片组Southbridge通过其提供的一些PCIe通道与之通信。
在多套接字系统上,套接字之间也必须发生缓存一致性流量和非本地内存访问。AMD可能仍然使用超传输(64位总线)。英特尔硬件在连接至强内部内核的环形总线上有一个额外的站,这个额外的连接是其他套接字的数据进出的地方。IDK物理总线的宽度。
问题内容: 我知道在该主题上也有类似的帖子,但是它们并没有完全解决我的问题。当您这样做时: (显然)大多数时间都会打印,因为以某种方式缓存了[-128,127]范围内的整数。但: 会回来的。我知道我正在请求一个Integer的新实例,但是由于装箱的原语在Java中是不可变的,并且已经有了执行“正确的事情”的机制(如第一种情况所示),为什么会发生这种情况? 如果Integer的所有实例(具有10)都
我对具有“洞”的元组感兴趣。这些孔是空结构。所有孔都将具有相同的类型,在此处称为“空”。 为了说明起见,让 。正如我所料, 。然而, 我不明白为什么最后两种类型的大小不是2(在
下面是我的AJAX函数: 如在铬合金中观察到的 即使在后续调用中,请求头也总是相同的: Chrome不应该在收到ETag标头后缓存资源并在后续调用相同URL时设置“If-Noo-Match”标头吗?我不应该获得304而不是200的状态码,因为返回的内容是相同的吗? 不过,对其他服务器(如Google地图服务器)中的资源的调用有时会返回304。
为什么我的值不能进入数据库? 如果需要更多的代码,请告诉我。 警告: 查询连接中的异常。php第713行:SQLSTATE[23000]:完整性约束冲突:1048列“name”不能为空(SQL:insert-into(,,,,)值(,,2016-06-19 21:44:05,2016-06-19 21:44:05)) 控制器: HTML页面:
问题内容: 为了防止错误共享,我想将数组的每个元素与高速缓存行对齐。因此,首先我需要知道高速缓存行的大小,因此我为每个元素分配了字节数。其次,我希望数组的开头与缓存行对齐。 我正在使用Linux和8核x86平台。首先,我如何找到缓存行大小。其次,如何在C中对齐缓存行。我正在使用gcc编译器。 因此,假设缓存行大小为64,结构将如下所示。 依此类推,假设0-63与高速缓存行对齐。 问题答案: 要知道
我有大约500MB的H2数据库。 H2的版本是1.2.147。 数据库的存储引擎是PageStore。 JDBC URL如下所示。 jdbc:h2:file://C:/h2/client;如果存在=真;MVCC=真;数据库\u事件\u侦听器。H2DBMonitor';AUTO_SERVER=TRUE;对数=2 我做了一个版本的H2 1.4.192没有改变数据库的存储引擎。 当我的客户使用数据库时,