gpt4 book ai didi

c++ - 不受主存储器约束的函数所需的复杂性是多少?

转载 作者:可可西里 更新时间:2023-11-01 18:39:25 26 4
gpt4 key购买 nike

我知道如果没有缓存数据,访问主内存会有很高的延迟。这个问题是关于吞吐量的。

在普通台式 PC 上永远不受主内存限制的功能所需的复杂性是多少?

我了解到现代 RAM 的带宽为 25-30GB/s(DDR3 RAM,双 channel 模式)。据我所知,使用现代 SIMD 指令集,现代英特尔处理器的单个内核每条指令最多可以存储 32 字节。它最多可以运行 4*10^9 条指令。如此有效,它可以输出大约 120GB/s。给定一个具有 8 个线程的处理器,作为最坏情况的估计,最大输出量约为 960GB/s。

处理器最多可以输出大约 36 倍于可写入 RAM 的数据。是否可以安全地假设任何运行非加载/存储操作的函数每次 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)

作为

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

鉴于第一个实现对缓存和寄存器施加了更多压力,而第二个实现具有更多加载/存储操作。

(当然,你可以告诉我基准测试,我对此很满意。但有时,我只是想做出有根据的猜测,并且只在以后出现问题或瓶颈时才重新审视这些东西。)

最佳答案

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

如果你有多个线程写入同一个地址(它们的数据将在不同的缓存行上)那么即使它已经被正确预取,如果另一个线程已经写入该地址那么它必须被转储并重新 -再次从主存中读取。

总而言之,我认为不可能在这个级别上对这类事情进行推理,这将取决于您所拥有的确切场景。

关于c++ - 不受主存储器约束的函数所需的复杂性是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42409592/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com