如何在Linux中分配满足分页和可缓存性要求的内存?

如何在Linux中分配满足分页和可缓存性要求的内存?,linux,memory-management,Linux,Memory Management,我想为一个大数组分配空间,这个数组在程序结束前只能写。出于这个原因,我不在乎它是否被缓存 我还想经常访问它,所以我不想多次进行页面漫游。出于这个原因,我希望它被分配在一个大的a页面(例如4M) 那我怎么能 …请求内存为不可缓存或直写 …请求将内存放在一个大页面中 我在Linux中工作 禁用缓存听起来似乎会使写入速度变慢,如果它强制写入整个RAM。我不确定我是否会尝试这样做 要真正使用大页面,我建议如下。它包含一个示例,说明如何通过共享内存段使用大型页面。对于透明的hugepages,只需分配

我想为一个大数组分配空间,这个数组在程序结束前只能写。出于这个原因,我不在乎它是否被缓存

我还想经常访问它,所以我不想多次进行页面漫游。出于这个原因,我希望它被分配在一个大的a页面(例如4M)

那我怎么能

  • …请求内存为不可缓存或直写
  • …请求将内存放在一个大页面中

我在Linux中工作

禁用缓存听起来似乎会使写入速度变慢,如果它强制写入整个RAM。我不确定我是否会尝试这样做


要真正使用大页面,我建议如下。它包含一个示例,说明如何通过共享内存段使用大型页面。

对于透明的hugepages,只需分配一个4M对齐的缓冲区即可。使用或
posix_memalign
获取一个指针,您可以
free
。(请注意,如果缓冲区大小不是对齐的倍数,则要求
aligned\u alloc
失败。/facepalm)

根据您对
/sys/kernel/mm/transparent\u hugepage/defrag
的设置,您可能需要在缓冲区上使用
madvise(MADV\u hugepage)
,以强烈鼓励内核使用hugepage

还请注意,x86-64使用了2M hugepages。x86-32使用4M hugepages。如果您希望两者都有一个简单的解决方案,那么调整到4M就可以了


请求内存为不可缓存或直写

顺便说一句,通过普通的Linux API很难做到这一点。工作到正常的写回内存,所以改用它。(它们超越了内存类型,是弱有序缓存旁路)


但是,如果您不一次写入完整的缓存线,那么您肯定需要缓存写入。特别是如果存在任何空间或时间位置,但即使没有,也让存储缓冲区执行其工作(隐藏缓存未命中存储的延迟)是一件好事。

您确定要使其不可缓存吗?也许你想要的是非时态的商店:@Adrian:非时态也不错。如何告诉编译器生成非时态存储?我已经有一段时间没有这样做了,但这里有一些起始链接-请记住,“只写”并不意味着缓存没有用处。对于通常的“写回”内存类型,写意味着读:在写之前,CPU将相应的行带入一级缓存,然后在一级缓存中进行写操作。因此,如果您对同一缓存线进行多次写入,您确实希望该缓存线位于一级缓存线中,因为它允许非常快地完成写入。如果不缓存写操作(例如,通过使用NT存储或WB内存),则每次写操作(或在beast时,缓存线的所有写操作)都必须一直到内存,这需要100秒的周期。。。。因此,您真的希望只对只写一次、多写或少写的内存执行这种行为(或者至少不频繁地写,以至于缓存行为不相关)。您还希望一次写入缓存线中的连续位置,以便至少使用写入组合功能,以便一次将一条缓存线发送到内存,而不是一次发送几个字节。