c - 内存的微观基准

标签 c benchmarking microbenchmark

我正在尝试用 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 缓存架构,但有两种基本方法应该适用于大多数处理器:

  1. 禁用内存缓冲区的 L1/L2/L3 缓存。这可能是确保不使用缓存的唯一真正方法。其变体是将其他一些未使用的内存区域的内容锁定到缓存中(即,如果禁用不是一个选项)。
  2. 如果第一种方法不可行,请使数组远大于 DCACHE 大小,并在该区域上使用 memcpy()。这里的想法是,缓存将被使用,但随着大数组的新部分被拉入缓存而被刷新。这应该提供一个非常接近直接从 CPU 到内存的基准测试。如果您使用 memset() 而不是 memcpy() 并且您的缓存是直写式的,则此基准测试应该与直接 CPU 相同内存路径。

在这两种情况下,为了获得更精确的结果,您应该确保在开始测试之前 array1[]array2[] 的内容尚未在缓存中。这可能需要在 memcpy() 测试之前分配和填充(或简单地读取)第三个缓冲区。当尝试避免缓存时,存在许多此类问题,如何解决和避免它们特定于缓存架构以及操作系统如何配置缓存(即,如果是 Linux,默认情况下可能不会) t 将缓存配置为直写)。

顺便说一句,您确实意识到您正在使用 memcpy() 方法测试内存读写?这种方法很好,但可能会产生更不可靠的结果。更好的方法可能是单独测试读取和写入,而不用像 memset()memcpy() 这样的函数。

关于c - 内存的微观基准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16905024/

相关文章:

c - 将三维数组传递给 C 中的函数

hashmap - Rust基准测试优化

C 字符串 : Random characters appearing in memory after using strcpy and strcat

c - 将 void*(*)(void*) 类型转换为 void(*)(void)

python - 反对使用 pystone 来估计跨多个系统的总体相对系统性能的论点是什么?

c++ - 二叉树基准测试结果

list - Java 8 流与迭代器性能

c - 如何在 RDMA 上构建性能测试和运行延迟测试

scala 特化 - 使用对象而不是类会导致速度减慢?

c - 我是 C 新手,正在测试代码,并且在使用函数时遇到困难