我们有一个(数字3浮点)矢量类,我很乐意将它对齐到16字节以便允许SIMD操作。使用declspec进行16字节对齐会导致一系列C2719错误(参数':带有__declspec(align('#')的形式参数)将不会对齐)。如果我无法传递对齐的矢量,那有什么意义呢?即使对向量使用const引用也会导致编译器错误,这实际上让我很烦恼。
有没有办法在这里做我想要的 - 获得16字节的类对齐,同时允许结构传递,而不必对__m128类型做一些愚蠢的欺骗?
答案 0 :(得分:6)
除非你一次操作一堆这些三维矢量结构,否则你不可能从使用SIMD中获得很多好处,在这种情况下你可能会将它们传递给一个数组,你可以使用它可以根据需要进行调整。您可能从SIMD获得一些好处的另一种情况是,如果您在每个向量上进行大量计算,并且可以在三个通道上并行化操作。在这种情况下,然后在函数开头进行一些手动操作以将其引入__m128
类型可能仍然可以为您带来一些好处。
答案 1 :(得分:3)
如果我无法传递对齐的矢量,那有什么意义呢?
__declspec(align(#))
看起来似乎没用。 C ++ 11支持你想要的东西; alignas
似乎以__declspec(align(#))
被打破的所有方式运作。例如,使用alignas
声明您的类型将导致该类型的参数对齐。
不幸的是,Microsoft的编译器还不支持标准对齐说明符,而我所知道的唯一编译器是Clang,它对Windows的支持有限。
无论如何,我只想指出C ++有这个功能,它最终可能会对你有用。除非你可以转移到另一个平台,所以现在你可能最好不要按值传递参数,正如其他人提到的那样
答案 2 :(得分:1)
当然你不需要按值传递数组?将指针传递给16字节对齐的数组。或者我误解了什么?
答案 3 :(得分:1)
Xbox360支持__declspec(passinreg),但目前不支持Visual Studio for Windows。
您可以在此投票支持此功能的请求: http://connect.microsoft.com/VisualStudio/feedback/details/381542/supporting-declspec-passinreg-in-windows
对于我们引擎中的向量参数,我们使用VectorParameter
typedef'到const Vector
或const Vector&
,具体取决于平台是否支持通过寄存器传递。
答案 4 :(得分:1)
虽然问题已经很久了,但VC ++编译器的情况并没有太大变化,所以这些笔记可能对某些人有价值。 1)允许将__declspec(align(X))传递给函数的类或结构的简单修复是通过引用传递的。根据需要使用consts。 2)使用SIMD进行矢量代数肯定是有原因的。通过将quat multiply和quat rotate功能切换到SIMD,我能够将引擎中的动画和蒙皮速度提高20%。没有对齐,没有数组。只有两个函数浮动[4]参数。对于那些开头写得不好并且导致可测量的FPS改善的东西,这没什么可打喷嚏的。而且由于这些是以后很难优化的事情,因此实际上没有对矢量代数进行过早优化的事情。 3)如果将向量转换为类,则堆栈中所有过多的_mm_store_ps和_mm_load_ps指令都会在/ O2下进行优化。因此,虽然通过SIMD获得单个添加的收益可能可以忽略不计,但如果您遇到连续运行多个操作的情况,则生成的代码速度非常快。