【发布时间】:2011-04-17 10:16:14
【问题描述】:
我想为一个大型数组分配空间,该数组在程序结束之前都是只写的。出于这个原因,我不在乎它是否被缓存。
我也想非常频繁地访问它,所以我不想多次浏览页面。出于这个原因,我希望它被分配在一个大页面中(例如 4M)。
那我怎么...
- ...请求内存不可缓存或直写?
- ...请求将内存放在大页面中?
我在 Linux 中工作。
【问题讨论】:
-
您确定要使其不可缓存吗?也许你想要一个非临时存储:stackoverflow.com/questions/37070/…
-
@Adrian:非临时性也不错。如何告诉编译器生成非临时存储?
-
我已经有一段时间没有这样做了,但是这里有一些起始链接 - stackoverflow.com/questions/661338/sse-sse2-and-sse3-for-gnu-c
-
请记住,“只写”并不意味着缓存没有用。对于通常的“回写”内存类型,写入意味着读取:在写入之前,CPU 将相应的行放入 L1 缓存中,然后写入发生在 L1 中。因此,如果您对同一个缓存行进行多次写入,您真的想要 L1 中的行,因为它允许写入非常快地完成。如果您不缓存写入(例如,通过使用 NT 存储或 WB 内存),则每次写入(或者,在野兽,缓存行的所有写入)都必须一直到内存,这需要 100 个周期.
-
...所以你真的希望这种行为只用于你只写一次的内存,或多或少(或者至少写得不频繁以至于缓存行为不相关)。您还希望一次在缓存行中写入连续的位置,以至少使用写入组合功能,以便一次将一个缓存行发送到内存,而不是一次发送几个字节。