gpt4 book ai didi

linux - 是否可以在 Linux 上的用户空间中分配不可缓存的内存块?

转载 作者:IT王子 更新时间:2023-10-28 23:37:15 25 4
gpt4 key购买 nike

我的应用程序中有一堆缓冲区(其中 25 到 30 个)相当大 (.5mb) 并且可以同时访问。更糟糕的是,它们中的数据通常只读取一次,并且经常更新(例如每秒 30 次)。有点像非最佳缓存使用的完美 Storm 。

无论如何,我突然想到,如果我可以将一 block 内存标记为不可缓存,那就太酷了……理论上,这会在缓存中为其他所有内容留出更多空间。

那么,他们是一种在 Linux 中获取标记为不可缓存的内存块的方法吗?

最佳答案

What Every Programmer Should Know About Memory 中介绍了如何避免此类数据污染缓存。 (PDF) - 这是从红帽开发的角度编写的,非常适合您。不过大部分都是跨平台的。

您想要的称为“非临时访问”,并告诉处理器期望您现在正在读取的值在一段时间内不会再次被需要。然后处理器避免缓存该值。

请参阅我上面链接的 PDF 的第 49 页。它使用 intel 内在函数来围绕缓存进行流式传输。

On the read side, processors, until recently, lacked support aside from weak hints using non-temporal access (NTA) prefetch instructions. There is no equivalent to write-combining for reads, which is especially bad for uncacheable memory such as memory-mapped I/O. Intel, with the SSE4.1 extensions, introduced NTA loads. They are implemented using a small number of streaming load buffers; each buffer contains a cache line. The first movntdqa instruction for a given cache line will load a cache line into a buffer, possibly replacing another cache line. Subsequent 16-byte aligned accesses to the same cache line will be serviced from the load buffer at little cost. Unless there are other reasons to do so, the cache line will not be loaded into a cache, thus enabling the loading of large amounts of memory without polluting the caches. The compiler provides an intrinsic for this instruction:

#include <smmintrin.h>
__m128i _mm_stream_load_si128 (__m128i *p);

This intrinsic should be used multiple times, with addresses of 16-byte blocks passed as the parameter, until each cache line is read. Only then should the next cache line be started. Since there are a few streaming read buffers it might be possible to read from two memory locations at once

如果在读取时以线性顺序通过内存读取缓冲区,那将是完美的选择。您使用流式读取来执行此操作。当您想修改它们时,缓冲区会按线性顺序修改,如果您不希望很快从同一个线程再次读取它们,您可以使用流式写入来做到这一点。

关于linux - 是否可以在 Linux 上的用户空间中分配不可缓存的内存块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/885658/

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