我正在制作一个微基准来测量内存读/写(顺序)延迟和吞吐量。问题在于该数字比我预期的高,结果似乎很奇怪。
当我使用pChase和tinymembench时(在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;
此代码是否正确测量了记忆访问时间?
侧面问题
我不确定两件事:
我认为这两个因素对于正确衡量内存访问时间很重要。
ENV