【发布时间】:2021-06-25 08:04:01
【问题描述】:
In this paper,据说optane PM的clwb和ntstore的8字节顺序写入延迟分别为90ns和62ns,顺序读取为169ns。
但在我使用 Intel 5218R CPU 的测试中,clwb 约为 700ns,ntstore 约为 1200ns。当然,我的测试方法和论文是有区别的,但是结果太差了,不合理。而且我的测试更接近实际使用情况。
在测试过程中,CPU 的 iMC 的 Write Pending Queue 或 optane PM 中的 WC 缓冲区是否成为瓶颈,导致阻塞,测量的延迟不准确?如果是这种情况,有没有检测工具?
#include "libpmem.h"
#include "stdio.h"
#include "x86intrin.h"
//gcc aep_test.c -o aep_test -O3 -mclwb -lpmem
int main()
{
size_t mapped_len;
char str[32];
int is_pmem;
sprintf(str, "/mnt/pmem/pmmap_file_1");
int64_t *p = pmem_map_file(str, 4096 * 1024 * 128, PMEM_FILE_CREATE, 0666, &mapped_len, &is_pmem);
if (p == NULL)
{
printf("map file fail!");
exit(1);
}
if (!is_pmem)
{
printf("map file fail!");
exit(1);
}
struct timeval start;
struct timeval end;
unsigned long diff;
int loop_num = 10000;
_mm_mfence();
gettimeofday(&start, NULL);
for (int i = 0; i < loop_num; i++)
{
p[i] = 0x2222;
_mm_clwb(p + i);
// _mm_stream_si64(p + i, 0x2222);
_mm_sfence();
}
gettimeofday(&end, NULL);
diff = 1000000 * (end.tv_sec - start.tv_sec) + end.tv_usec - start.tv_usec;
printf("Total time is %ld us\n", diff);
printf("Latency is %ld ns\n", diff * 1000 / loop_num);
return 0;
}
非常感谢任何帮助或更正!
【问题讨论】:
-
您的“In this paper”链接是stackoverflow.com。你指的是什么论文?
-
我希望
sfence在每次 qword 写入后都会严重损害内存级并行性。特别是因为这意味着您正在执行部分行 NT 存储,因为高速缓存行中有 8 个 qwords,并且您只在其中一个之后执行 sfence。 IIRC,对同一行的多次背靠背写入对 Optane 也特别不利。 -
@Peter Cordes 我更新了链接。
sfence和你说的一模一样,但是在大多数实际情况下,你必须在每个ntstore/clwb之后做sfence,以确保持久一致性。那篇论文也是用这种方式测量延迟(但使用mfence而不是sfence,更强的围栏)。对于clwb,有或没有sfence只相差100ns。ntstore没有sfence的延迟只有16ns,因为没有sfence的ntstore相当于几乎没有持久化。所以我仍然不知道为什么它与论文中的数据差异如此之大。谢谢! -
是的,这是有道理的,封装/软件架构使得很难推迟不需要持久订购的商店之间的sfence。不过,您通常仍然只需要在其他工作之间进行有限数量的持久性存储,对吗?因此,此测试与实际工作负载之间仍可能存在显着差异。而且这肯定不再是最好的案例了。
标签: x86-64 intel cpu-architecture persistent-memory