![]() |
1
2
实际上,我们在工作中使用SIMD,也许我可以给你我的反馈。 在处理SIMD时,您必须注意对齐,这是为了确保缓存线对齐。 然而,我不确定如果它没有对齐,或者CPU是否能够管理(就像以前未对齐的标量类型一样,它会导致崩溃,现在CPU处理它,但它会降低性能),它是否仍会导致崩溃。 也许你可以看看这里 SSE, intrinsics, and alignment 它似乎对问题的对齐部分有很好的答案。 因为您将它用作3D矢量,即使它实际上是一个4D矢量,这并不是一个真正好的实践,因为您不能从SIMD指令的所有性能中获益。最好的匹配方法是使用数组结构(SOA)。 注:我假设128位SIMD寄存器映射到4种标量类型(int或float) 例如,如果您有4个3D点(或矢量),那么您将有4个4D矢量,忽略每个点的第4个分量。 总的来说,您最终可以访问4*4个值。 通过使用SOA,您将拥有3个SIMD 128位(12个值)寄存器,并将按以下方式存储点。 模拟指令集
这样可以填充整个SIMD寄存器,从而最大限度地发挥SIMD的优势。另一件事是,您必须进行的许多计算(例如,添加2组4个矢量)只需要3条SIMD指令。它的使用和理解有点棘手,但当你这样做时,收获是巨大的。 当然,您不能在所有情况下都这样使用它,所以您将回到忽略最后一个值的原始解决方案。 |
![]() |
llewmills · 根据数字是否为整数过滤数值向量[重复] 2 年前 |
![]() |
Rocket Procd · 在c中向向量插入元素++ 2 年前 |
![]() |
Daniel · 为什么我不能手动定义模板参数? 2 年前 |
![]() |
Swantewit · 将数组值推送到Rust中的向量 2 年前 |
![]() |
Giffyguy · 如何限制在构造向量后调用'resize()'? 2 年前 |
![]() |
clarkk · 当声明向量时,(1)是什么意思? 2 年前 |
![]() |
Loui Augst · 仅在局部X轴上将游戏对象指向另一个对象 2 年前 |
![]() |
F.A. · 从int向量中附加整数的字符串不会打印任何内容 2 年前 |