函数不受主内存约束的函数所需的复杂性是什么?



我知道,如果数据未缓存,则访问主存储器具有很高的延迟。这个问题是关于吞吐量

在常规桌面PC上,函数永远不会受到主内存的束缚是什么?

我读到有关现代公羊的带宽为25-30GB/s(DDR3 RAM,双通道模式)。据我所知,现代英特尔处理器的单个核心最多可以使用现代SIMD指令集的每个说明最多存储32个字节。它最多可以运行4*10^9的说明。因此,它可以有效地输出约120GB/s。给定一个带有8个线程的处理器,最大输出量约为960GB/s,作为最坏的情况。

处理器最多可以发出约36倍可以写入RAM的数据的36倍。是否可以肯定地假设,每个运行非载荷/商店操作的功能每SIMD商店或负载超过36个周期(或常规8字节商店或负载超过9个周期)永远不会受到主内存的束缚?该估计值可以显着降低还是出于某些原因太低?

鉴于我有:

X = (x_1, x_2, ..., x_n) // dataset, large enough to make good use of caches
a(x), b(x), c(x, y), d(x) := c(a(x), b(x)) // functions that operate on elements
A(x) := (a(x_1), a(x_2), ..., a(x_n)) // functions that operate on data sets

我正在寻找指导方针,而实施更好(或不利)

D(X)

AS

C(A(X), B(X))

鉴于第一个实现对缓存和寄存器造成了更大的压力,而第二个实现具有更多的负载/商店操作。

(当然,您可以告诉我对此进行基准的东西,我对此很好。但是,有时候,我只想做一个有根据的猜测,只重新审视东西,稍后它变成问题或瓶颈。)

我认为这在很大程度上取决于代码是否以CPU可以将下一个数据项预取到缓存的方式。如果它预取错误的数据,那么无论您花费在处理当前数据的时间内,您仍然会被内存绑定。

,如果您有多个线程写入同一地址(它们的数据将在不同的缓存线上),那么即使对其进行了正确的预取,如果其他线程已写入该地址再次从主内存中读取。

总而言之,我认为在此级别上不可能就这些事情进行推理,这将取决于您的确切情况。

最新更新