我正在尝试用 C 语言编写一个微型基准测试来测试内存。
我相信我的机器(Intel i5)上的缓存大小是 8MB..
有人可以建议一些逻辑来测试内存,同时确保缓存未命中率为 100%?
array1 = malloc(DCACHE_SIZE);
array2 = malloc(DCACHE_SIZE);
while(condition)
memcpy(&array1[index], &array2[index], sizeof(char));
index++;
目前,使用 memcpy,我的程序每秒调用 memcpy 420,782,149 次。 我认为这个数字有严重错误(它多次命中缓存)
如何避免缓存?
最佳答案
我不太熟悉 Intel i5 缓存架构,但有两种基本方法应该适用于大多数处理器:
- 禁用内存缓冲区的 L1/L2/L3 缓存。这可能是确保不使用缓存的唯一真正方法。其变体是将其他一些未使用的内存区域的内容锁定到缓存中(即,如果禁用不是一个选项)。
- 如果第一种方法不可行,请使数组远大于 DCACHE 大小,并在该区域上使用
memcpy()
。这里的想法是,缓存将被使用,但随着大数组的新部分被拉入缓存而被刷新。这应该提供一个非常接近直接从 CPU 到内存的基准测试。如果您使用memset()
而不是memcpy()
并且您的缓存是直写式的,则此基准测试应该与直接 CPU 相同内存路径。
在这两种情况下,为了获得更精确的结果,您应该确保在开始测试之前 array1[]
和 array2[]
的内容尚未在缓存中。这可能需要在 memcpy() 测试之前分配和填充(或简单地读取)第三个缓冲区。当尝试避免缓存时,存在许多此类问题,如何解决和避免它们特定于缓存架构以及操作系统如何配置缓存(即,如果是 Linux,默认情况下可能不会) t 将缓存配置为直写)。
顺便说一句,您确实意识到您正在使用 memcpy()
方法测试内存读写?这种方法很好,但可能会产生更不可靠的结果。更好的方法可能是单独测试读取和写入,而不用像 memset()
和 memcpy()
这样的函数。
关于c - 内存的微观基准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16905024/