如何测量内存读写延迟和吞吐量

时间:2019-08-12 04:21:03

标签: c microbenchmark

我正在制作一个微基准来测量内存读/写(顺序)延迟和吞吐量。问题在于该数字比我预期的高,结果似乎很奇怪。

当我使用pChasetinymembench时(在tinymembench中,我从“ C填充”测量中获得了数字),该数字显示在 15,000 MiB / s-18,000 MiB / s 。但我建立的那台机器显示 23,000 MiB / s

我知道pChase实际上是一种指针追逐机制,因此它比访问一个简单数组要花更多的时间,但是我认为我和pChase之间的差距应该没有太大差别。

这是内存访问代码的核心部分:

#define CACHE_LINE_BYTES 64

char *target;
int *i_target;

if (posix_memalign((void **) &target, CACHE_LINE_BYTES, wss) != 0)
    fprintf(stderr, "posix_memalign() failed\n");

memset(target, 0, wss);

while (num_round <= config.num_round) {
    iteration = 0;
    clock_gettime(CLOCK_MONOTONIC, &before);
    while (1) {
        // inner loop
        i_target = target;
        for (uint64_t i = 0; i < wss; i += 64) {
            if (rw == 'r') {
                dummy = *i_target;
            }
            else if (rw == 'w') {
                *i_target = i;
            }
        } // end inner loop
        iteration++;
        clock_gettime(CLOCK_MONOTONIC, &after);
        diff_time = diff_sec(before, after);
        if (diff_time >= 1.0)
            break;
    }
    if (best >= diff_time)
        best = diff_time;
    num_round++;
} // end outer loop

latency = latency / wss * CACHE_LINE_BYTES // for write 
throughput = (wss * iteration) / best / MiB;

此代码是否正确测量了记忆访问时间?

侧面问题

我不确定两件事:

  • 应该执行多少个循环?
  • 我应该为边界设置多少时间? (1.0秒以上)

我认为这两个因素对于正确衡量内存访问时间很重要。

ENV

  • 工作集大小:16MiB

0 个答案:

没有答案