有没有办法对编译器说:
“不要尝试在不同的缓存中寻找它,并且每次都会错过。去找 RAM”
这样,访问一个巨大的数组应该会更快,尽管如此,该数组很可能会存储在那里。
这是假设它从一开始就存储在 RAM 中。我读取 CPU 负载字节块,因此,如果我需要访问一个数组元素,对其进行一些操作并访问另一个元素,是否会导致缓存未命中,或者是否没有必要?是否每次都会从数组中加载 x 字节的块,以便当到达块的末尾时,下一个会自动存储在缓存中?
让我们想象一个 10^9 浮点数数组。
您可能正在寻找Non-Temporal内存访问汇编指令,例如
vmovntdqa
,它们告诉CPU避免过度使用缓存。这不会使访问速度更快,但可以避免将您希望保留在缓存中的内容推出缓存。
这些指令只是提示,并不总是在 CPU 上实现。确切的行为似乎很难在网上研究。这里的 comment 表示,如果您想在不使用缓存的情况下加载,则应该使用
prefetchntdqa
来代替。在使用这些特殊指令之前,您可能应该深入研究处理器的缓存行为,并有办法知道它是否正常工作。
请注意,这些是 SIMD 指令,一次将 128、256 或 512 位加载到适当大小的 SIMD 寄存器中,而不是通用寄存器中。
看来你需要使用内联汇编来让GCC生成这些指令。