繁体   English   中英

内在:使用 __128 个寄存器

[英]Intrinsics: using __128 registers

我正在使用 SIMD 并考虑用于 3D 数学中的矢量运算。 而是有

class Vec4f
{
float val[4]; 
//+operators here
}

我本可以有

class SimdVec4f
{
 __m128 val; //+operators
}

但是由于__m128只有 8 个可用寄存器,如果我想要这个类的实例超过 8 个,会发生什么? 编译器是否像普通变量一样自行处理从内存到寄存器的加载,反之亦然?

感谢您抽出宝贵时间让我对此有所了解。

这与int变量多于整数寄存器时完全相同:如果同时存在太多变量,编译器可能不得不将它们溢出到内存中,然后再重新加载它们。 向量寄存器的寄存器分配与整数寄存器的寄存器分配几乎相同,分析函数的数据流并找出哪些变量同时处于活动状态。

您应该将_mm_load_ps/loadustore/storeu内在函数视为更多地描述了向量类型之间的类型双关,而不是唯一可以编译为向量加载或存储指令或始终编译为加载/存储的东西.


顺便说一句,x86-64 有 xmm0..15。 如果您希望需要多个寄存器的代码高效,请编译为 64 位。


3D 向量的 SSE:

通常避免在 SIMD 向量中保留单个方向/几何向量。 您可以有效地添加,但任何交叉或点积或长度计算都需要改组。

如果您可以使用 4 个x值的向量、4 个y值的向量等,则更好,这样您就可以并行计算 4 个长度。 有关更多信息,请参阅https://stackoverflow.com/tags/sse/info ,尤其是这些幻灯片: Insomniac Games (GDC 2015) 中的 SIMD,它展示了如何布置数据以实现高效的 SIMD。 (数组结构,不是结构数组)。

另请参阅使用 Haswell 架构的并行编程

有时,在您无法重新组织以并行计算大量事物的情况下,您可以获得单个向量的小好处。 _mm_setr_ps()如果源数据不连续, _mm_setr_ps()可能会很慢。

已经有几个用于 SIMD 的 C++ 包装库,例如Agner Fog 的GPL Apache-licensed VectorClass和其他一些。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM