Caching “a”是多少钱;数据行“;?

Caching “a”是多少钱;数据行“;?,caching,assembly,memory,intrinsics,Caching,Assembly,Memory,Intrinsics,据 预回迁T0、预回迁T1、预回迁T2和预回迁NTA 将包含地址p的内存中的数据行提取到本地性提示i指定的缓存继承权中的某个位置 我相信“数据线”对于熟悉上下文的人来说是显而易见的,但对我来说却是个谜。如果我提供一个指向某些要预取的数据的指针,那么将要获取的数据量是多少?4B?64B?1KB 如果我打算稍后从该地址读取32B,而它只预取16B,我是否应该使用偏移量多次预取?这是指在当代CPU体系结构上为64字节的缓存线 由于CPU在再次缓存数据之前检查数据是否已经在缓存中,因此预取的频率超过需要

预回迁T0、预回迁T1、预回迁T2和预回迁NTA 将包含地址p的内存中的数据行提取到本地性提示i指定的缓存继承权中的某个位置

我相信“数据线”对于熟悉上下文的人来说是显而易见的,但对我来说却是个谜。如果我提供一个指向某些要预取的数据的指针,那么将要获取的数据量是多少?4B?64B?1KB

如果我打算稍后从该地址读取32B,而它只预取16B,我是否应该使用偏移量多次预取?

这是指在当代CPU体系结构上为64字节的缓存线

由于CPU在再次缓存数据之前检查数据是否已经在缓存中,因此预取的频率超过需要时不应受到惩罚。但是,缓存近期不需要的数据可能会导致性能损失,因为您会从缓存中逐出其他数据,并使用CPU上可用于加载其他数据的加载端口


当有疑问时,基准测试。

你有我称之为提取线和缓存线的东西,它们是两种不同的东西,一些处理器(特别是带有管道的处理器)会在一次提取中提取一些块,比如32或64字节,因为总线更复杂,需要多次握手来移动数据,因此,对齐,数据效率更高,而且可以更好地填充管道。缓存线与缓存和主/慢速内存之间的类似传输大小有关。而且通常更大。但是没有关于大小的规则,这取决于每个实现。基于一些有关这方面的web搜索,预取在较新的处理器上几乎没有好处,因为较新处理器上的硬件预取做得很好,除非您可以在实际需要数据之前进行预取,即使在这种情况下,最终一个循环可以达到内存带宽限制。在奔腾4时代,预取更有用。大约有一个先前的线程。@rcgldr我认为它仍然有相当大的影响。我在优化一个被随机I/O严重限制的算法,除了多线程外,我还尝试在一个线程内解决该算法的多个实例,但在性能方面基本相同。不过,将预回迁添加到混合中给了我约30%的性能提升,这是在年的sandy bridge处理器上实现的ml64@user81993-你的经验与其他人提到的不同。在这种情况下,对于一次读取128字节的CRC16(或CRC32,仅常量更改)的高度优化生成,不使用预取指令,如果您的程序是随机I/O绑定的,那么内存预取有何帮助?每次读取前是否对缓冲区进行预取?@rcgldr由于线程中的独立实例彼此无关,我可以为下一次循环迭代计算每个实例所需的数据地址,对所有实例发出预取命令,然后继续一次解决一个实例。我的理论是,随着时间的推移,所需的数据越来越有可能已经在缓存中,因此它不必等待这些数据。我在每个线程执行8个实例时得到了最好的结果,之后我似乎碰到了另一堵墙,因为额外的实例并没有提高速度。