Ram 中的分配数组,无缓存未命中,C/C++

问题描述 投票:0回答:1

有没有办法对编译器说:

“不要尝试在不同的缓存中寻找它,并且每次都会错过。去找 RAM”

这样,访问一个巨大的数组应该会更快,尽管如此,该数组很可能会存储在那里。

这是假设它从一开始就存储在 RAM 中。我读取 CPU 负载字节块,因此,如果我需要访问一个数组元素,对其进行一些操作并访问另一个元素,是否会导致缓存未命中,或者是否没有必要?是否每次都会从数组中加载 x 字节的块,以便当到达块的末尾时,下一个会自动存储在缓存中?

让我们想象一个 10^9 浮点数数组。

c++ c caching memory-management ram
1个回答
0
投票

您可能正在寻找Non-Temporal内存访问汇编指令,例如

vmovntdqa
,它们告诉CPU避免过度使用缓存。这不会使访问速度更快,但可以避免将您希望保留在缓存中的内容推出缓存。

这些指令只是提示,并不总是在 CPU 上实现。确切的行为似乎很难在网上研究。这里的 comment 表示,如果您想在不使用缓存的情况下加载,则应该使用

prefetchntdqa
来代替。在使用这些特殊指令之前,您可能应该深入研究处理器的缓存行为,并有办法知道它是否正常工作。

请注意,这些是 SIMD 指令,一次将 128、256 或 512 位加载到适当大小的 SIMD 寄存器中,而不是通用寄存器中。

看来你需要使用内联汇编来让GCC生成这些指令。

© www.soinside.com 2019 - 2024. All rights reserved.