gpt4 book ai didi

c - 内存的微基准测试

转载 作者:行者123 更新时间:2023-12-02 00:08:28 24 4
gpt4 key购买 nike

我正在尝试用 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/

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