如何正确使用std :: arch :: _ mm_loadu_si128 / _mm_storeu_si128

时间:2018-09-06 20:08:38

标签: rust undefined-behavior simd memory-alignment

通常,应该警惕将指针转换(或强制转换)为更高的对齐方式。但是,上述功能的接口分别需要*const _m128i*mut _m128i指针。两者都是SIMD对齐的,这意味着我也需要保持阵列SIMD对齐。另一方面,内在函数被明确设计为加载/存储未对齐数据。

这样安全吗?我们不应该更改界面吗?或至少记录了这一事实?

1 个答案:

答案 0 :(得分:3)

我认为这是Is `reinterpret_cast`ing between hardware vector pointer and the corresponding type an undefined behavior?的跨语言副本。

正如我在那边解释的那样,英特尔定义了C / C ++内部函数API,使得loadu / storeu可以安全地取消引用未对齐的指针,并且即使创建此类指针也是安全的它是ISO C ++中的UB,甚至可以创建未对齐的指针。 (因此提供内在API的实现必须定义行为)。

Rust版本应该工作相同。提供此功能的实现必须确保创建未对齐的__m128i*指针是安全的,只要您不“手动”取消引用它们即可。

另一个API设计选项是使用另一种类型的版本,该版本不暗示16字节对齐,例如__m128i_u之类。 GNU C使用其本机矢量语法来做到这一点,但这与Rust无关。