【问题标题】:how to use non-temporal (streaming) store instructions to store a self-defined struct?如何使用非时间(流)存储指令来存储自定义结构?
【发布时间】:2021-02-26 13:01:38
【问题描述】:

我刚刚开始使用非临时存储指令将某些类型的数据存储到内存(可以是 DRAM 或 NVM)。我查看了 Intel Intrinsics Guide 以了解此类存储函数,并找到了 _mm_stream_si32、_mm_stream_si18、_mm_stream_si256 等函数。似乎这些函数只能应用于某些类型的整数。 我的问题是,如果我自定义某种类型的结构并且它的大小可能是 1KB、2KB ......我如何执行非临时(流式)存储来将这种类型的结构存储到我的内存中(或反之亦然,从内存中加载)。 目前,我只能想出一种方法,将我的结构转换为一大块整数,并为每个转换的整数一个接一个地应用非时间/流式存储/加载。我觉得这种方法效率有点低,有没有更高效的编码方式来实现我的目标?

另外,如果我想存储大量这样的自定义结构,是否需要在每次非临时存储之后发出sfence?我对此不确定,想知道是否可以删除 sfence 指令或在执行所有非临时存储后仅发出一条 sfence 指令?

非常感谢您的帮助。

【问题讨论】:

    标签: c++ c x86 intel persistent-memory


    【解决方案1】:

    非时间流与结构无关,更多的是缓存污染。 _mm_stream_si32 将一个 32 位整数存储到内存中,如果地址还没有在缓存中,则将其直接写入内存。

    正常写入 32 位整数,将获取 64 字节缓存行并写入缓存,因为预计写入地址附近的其他数据也会被使用,因此缓存将有好处。但是在总线上取64字节是不需要的,因此可以通过特殊指令提示CPU不需要。

    之所以称为“非临时”,是因为写入的值在不久的将来不会被使用,因此缓存它是没有意义的。之所以称为“流”,是因为它是“流 SIMD 扩展”的一部分,但与流无关。

    详情请参阅“英特尔系统编程指南”和“英特尔优化指南”。

    【讨论】:

    • 那么,从这个意义上说,对于像结构这样的任何其他数据类型的数据,唯一的方法是将其分成几个整数并使用非临时存储/加载指令来访问它们?问题是我认为整数不是一种非常灵活的数据类型。即使是 32 位整数,您仍然需要将任何其他数据类型转换为一些 4 字节整数。想知道是否有任何细粒度的非临时指令可以访问粒度为 1 字节的数据,就像 'char'。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 2018-07-27
    • 2016-10-30
    • 2011-12-11
    • 1970-01-01
    相关资源
    最近更新 更多