2012-03-02 78 views
3

我对SLMATH library有问题。不确定是否有人使用它或之前使用过它?无论如何,问题是当我启用SSE优化(在VS 2010中)编译时,我显然必须提供一个容器,它具有正确的SSE类型对象的字节对齐方式。这是好的,因为SLMATH中有一个类是一个对齐的向量;它对齐8字节边界上的向量分配(即,我不使用std :: vector <>)。C++ SLMATH库和SSE优化

现在的问题是,它出现的任何结构或类,包含类似slm :: mat4的东西,也必须在它被放入集合之前在这样的边界上对齐。所以,例如,我使用了一个对齐的向量来创建一个slm :: mat4数组,但是如果我创建一个名为Mesh的类,并且Mesh包含一个slm :: mat4,并且我想将Mesh放入一个std :: vector中,好吧,我在调试时出现奇怪的内存错误。

因此,鉴于文档确实非常稀少,任何使用此库的人都可以告诉我,我必须做什么才能将其与SSE优化结合使用?我的意思是我不喜欢这样的想法:绝对无处不在使用对齐的向量来代替std :: vector,以防slm :: component以某种方式被封装到类或结构中。

或者,如果周围有一个像SLMATH一样好的快速矢量/矩阵/图形数学库会很好。

感谢您提供任何建议。

编辑1:不使用SLMATH简单的摄制情况说明了这个问题:

#include <vector> 

class Item 
{ 

public: 

    __declspec(align(8)) 
    struct { 

     float a, b, c, d; 

    } Aligned; 
}; 


int main() 
{ 
    // Error - won't compile. 

    std::vector<Item> myItems; 
} 

罗宾

回答

1

如果您在声明的变量使用__declspec(align)你的变量声明它可能会奏效,或者将它们包装在一个声明自己正确对齐的结构中。我没有使用过这个库,但似乎这可能是您所面临的问题。

对齐选项的参考可以找到here

+0

不幸的是,这给std ::编译错误,说当集合调用resize时结构将不会对齐。这对我来说似乎完全合理,但这意味着我可能无法在我的项目中的任何地方使用std容器。 – Robinson 2012-03-02 13:47:42

+0

其实我打算把这个标记为答案。这是因为对齐,但这不是我所期望的。 stl不支持它(至少MS版本!)。所以我正在关闭编译器中的优化。 – Robinson 2012-03-02 15:25:44

+0

一种解决方法是在你的类中提供手动填充,并向STL提供你自己的分配器,以便将新对象放置在128位边界上。如果你在矩阵中四处移动以使其位于边界上,即使没有对齐,它也可以工作。这至少可以说是脆弱的,但它应该按预期运行。 – Dervall 2012-03-02 16:05:01