如何使用非临时流式存储指令来存储自定义结构?

问题描述

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

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

非常感谢您的帮助。

解决方法

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

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

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

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