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

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

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

最佳答案
我认为这是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无关.

转载注明原文:锈-如何正确使用std :: arch :: _ mm_loadu_si128 / _mm_storeu_si128 - 代码日志