0

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

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

非常感谢您的帮助。

4

1 回答 1

1

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

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

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

有关详细信息,请参阅“英特尔系统编程指南”和“英特尔优化指南”。

于 2021-02-26T15:57:30.890 回答