【发布时间】:2016-09-19 01:26:54
【问题描述】:
我希望确保 SSE 用于我的 3D(96 位)浮点向量的算术运算。但是,我已经阅读了关于什么是必要的相互矛盾的观点。
有些文章/帖子说我需要使用 4D 向量并“忽略”第四个元素,有些人说我必须用 __declspec(align(16)) 之类的东西装饰我的类并覆盖 new 运算符,有些人说编译器是足够聪明地为我整理东西(我真的希望这是真的!)。
我正在使用 Eigen 库,但发现“不支持”AlignedVector3 类不适合目的(例如,在进行组件除法时除以零错误,lpNorm 函数包含虚拟的第 4 个元素) .
我读过的很多文章已经有好几年了,所以我希望现代编译器/SSE 版本/CPU 可以为我对齐数据,或者使用非 16 字节对齐的数据。任何有关这方面的最新知识将不胜感激!
【问题讨论】:
-
CPU 不能自行启动并开始对齐内容,它们只会执行代码告诉它们执行的操作。另外,如果可能的话,停止这个想法,而是在单独的坐标上使用 SIMD,这样你就不必浪费第 4 条车道(而且通常几乎所有的事情都会更好,SIMD 向量不打算用作 linalg 向量)
-
感谢您的评论(不明白为什么这个问题被否决了......)。无论如何,我不确定您所说的“在单独的坐标中使用 SIMD”是什么意思——您的意思是批量处理多个 3D 矢量(如果可能的话,那也很酷)?我还刚刚发现了 C++11
alignas(16)装饰器。我添加它来包装我的通用维度向量类,它没有导致崩溃 - 当然,没有证据证明正在使用 SIMD。 -
是的,批量处理,也许使用 3 个指针 (x,y,z) 到您使用 _aligned_malloc 获得的块中。此外,如有必要,您可以加载/存储未对齐的。整个声明式对齐处理在 C++ 中并不能很好地工作,例如,如果您将该类型放入容器中,除非您使用自定义分配器,否则它仍然会中断。