【问题标题】:C++ SLMATH library and SSE optimisationC++ SLMATH 库和 SSE 优化
【发布时间】:2012-03-02 13:29:32
【问题描述】:

SLMATH library 有问题。不知道有没有人用过或者以前用过?无论如何,问题是当我在启用 SSE 优化的情况下进行编译时(在 VS 2010 中),我显然必须为 SSE 类型对象提供一个具有正确字节对齐的容器。这没关系,因为 SLMATH 中有一个小类是对齐向量;它在 8 字节边界上对齐向量分配(即我不使用 std::vector)。

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

因此,鉴于文档确实非常稀少,任何使用过这个库的人都可以告诉我,确切地说,我必须做什么才能将它与 SSE 优化一起使用?我的意思是我不喜欢必须在任何地方都使用对齐向量来代替 std::vector 的想法,以防 slm:: 组件最终以某种方式被封装到一个类或结构中。

或者,如果有一个和 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;
}

罗宾

【问题讨论】:

    标签: c++ sse


    【解决方案1】:

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

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

    【讨论】:

    • 不幸的是,这会从 std:: 给出一个编译错误,说当在集合上调用 resize 时结构不会对齐。这对我来说似乎完全合理,但这意味着我可能无法在我的项目中的任何地方使用标准容器。
    • 其实我要把这个标记为答案。这是因为对齐,但这不是我所期望的。 stl 不支持它(至少是 MS 版本!)。所以我要关闭编译器中的优化。
    • 一种出路是在您的类中提供手动填充,并为 STL 提供您自己的分配器以将您的对象放置在 128 位边界上 new。如果您在矩阵周围填充以推动它以使其正确位于边界上,即使没有对齐也可以工作。这至少可以说有点脆弱,但它应该按预期运行。
    猜你喜欢
    • 2017-07-31
    • 2011-12-09
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2016-09-11
    • 1970-01-01
    • 2021-06-10
    相关资源
    最近更新 更多