【问题标题】:What is the latency of `clwb` and `ntstore` on Intel's Optane Persistent Memory?Intel Optane Persistent Memory 上 `clwb` 和 `ntstore` 的延迟是多少?
【发布时间】:2021-06-25 08:04:01
【问题描述】:

In this paper,据说optane PM的clwbntstore的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,因为没有sfencentstore相当于几乎没有持久化。所以我仍然不知道为什么它与论文中的数据差异如此之大。谢谢!
  • 是的,这是有道理的,封装/软件架构使得很难推迟不需要持久订购的商店之间的sfence。不过,您通常仍然只需要在其他工作之间进行有限数量的持久性存储,对吗?因此,此测试与实际工作负载之间仍可能存在显着差异。而且这肯定不再是最好的案例了。

标签: x86-64 intel cpu-architecture persistent-memory


【解决方案1】:

https://www.usenix.org/system/files/fast20-yang.pdf 描述了他们正在测量的内容:执行 one 存储的 CPU 端 + clwb + mfence 用于缓存写入1。因此,将存储“接受”为持久化的 CPU 管道延迟。

这与一直到 Optane 芯片本身不同;内存控制器的写入挂起队列 (WPQ) 是 Cascade Lake Intel CPU 上持久性域的一部分,例如您的 CPU; wikichip quotes an Intel image:

脚注 1:还要注意 clwb on Cascade Lake works like clflushopt - it just evicts。所以 store + clwb + mfence 在循环测试中会测试缓存冷的情况,如果你不做任何事情来加载定时间隔之前的行。 (从论文的描述来看,我认为他们确实如此)。未来的 CPU 希望正确支持clwb,但至少 CSL 得到了支持的指令,因此未来的库在使用它之前不必检查 CPU 功能。


您正在执行 许多 存储,这将填满内存控制器或内存层次结构中其他位置的所有缓冲区。因此,您测量的是循环的吞吐量,而不是一个存储的延迟加上之前空闲 CPU 管道中的 mfence 本身。

除此之外,例如,重复重写同一行似乎比顺序写入要慢。这个Intel forum post 报告“重复刷新高速缓存行”的“延迟更高”,而不是刷新不同的高速缓存行。 (DIMM 内的控制器确实会进行磨损均衡,顺便说一句。)

有趣的事实:下一代 Intel CPU (perhaps CPL or ICX) 将在持久域中甚至拥有缓存 (L3?),希望使 clwb 更便宜。 IDK 如果这会影响到同一位置的背靠背movnti 吞吐量,甚至clflushopt


在测试过程中,是不是CPU的iMC的Write Pending Queue或者optane PM中的WC buffer成为瓶颈,导致阻塞,测得的延迟不准确?

是的,这是我的猜测。

如果是这种情况,有没有检测工具?

我不知道,对不起。

【讨论】:

  • 我也发现“重复重写​​同一行似乎比顺序写入慢”。并且不同行的 store + clwb + sfence 在我的循环中为 230ns,这与论文中的数据相匹配,因为我的循环是缓存冷情况(在存储前加载)。谢谢,你帮了我很多次!
  • @dangzzz 我不认为pmem_map_file 预先分配了内存并且您没有进行任何初始化。这可能是您的测量结果与论文中报告的数字之间存在差异的最大原因。另一个重要原因是您的处理器和本文中使用的不同频域中的不同频率。论文中哪里说“store + clwb + sfence”的延迟是230ns?你不是说这个case的延迟是700ns吗?此外,数字 57ns 和 62ns 与图 2 不匹配。
  • @HadiBrais 我已经测试了页面错误的影响,我做了两次循环,只测量了第二次。这没什么区别。使用 linux perf 工具,我看到页面错误只占总周期的 3%。 57ns 和 62ns 是我写的错误,实际上是 90ns 和 62ns。
  • BENCHMARK_BEGIN 序列中,local_irq_disable() 是多余的。在drop_cache() 函数中,mfence 是多余的。我知道报纸上说工作台执行 64 位存储,但代码执行两个 32 字节存储。也许这是论文中的错误。关于页面错误,如果没有显着差异,那么它要么意味着pmem_map_file 已经预先设置了缓冲区,或者与在整个页面上执行 store+clwb 所花费的时间相比,页面错误的成本非常小。
  • 是的,我在这里忘记了我们谈论的是映射文件而不是普通内存。我查看了pmem_map_file 在 Linux 上的实现。它基本上首先使用标志O_CREAT | O_RDWR 调用open(),然后使用标志MAP_SHARED_VALIDATE | MAP_SYNC 将文件描述符传递给mmap。结果地址由pmem_map_file 返回。我不认为这是先决条件。它也可能使用大页面。
猜你喜欢
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 2017-03-05
相关资源
最近更新 更多