Библиотека C ++ SLMATH и оптимизация SSE - PullRequest
3 голосов
/ 02 марта 2012

У меня проблема с SLMATH библиотекой .Не уверен, если кто-то использует это или использовал это раньше?В любом случае, проблема в том, что когда я компилирую с включенной оптимизацией SSE (в VS 2010), я, очевидно, должен предоставить контейнер, который имеет правильное выравнивание байтов для объектов типа SSE.Это нормально, потому что в SLMATH есть небольшой класс, который является выровненным вектором;он выравнивает распределение вектора по 8-байтовой границе (т.е. я не использую std :: vector <>).

Теперь проблема в том, что появляется любая структура или класс, который содержит что-то вроде slm :: mat4 mustтакже выровняйте по такой границе, прежде чем поместить в коллекцию.Так, например, я использовал выровненный вектор для создания массива slm :: mat4, но если я создаю класс с именем Mesh, а Mesh содержит slm :: mat4, и я хочу поместить Mesh в std :: vector,ну, я получаю странные ошибки памяти во время отладки.

Итак, учитывая, что документация действительно очень скудна, может ли кто-нибудь, кто использовал эту библиотеку, сказать мне, что именно я должен сделать, чтобы использовать ее с оптимизацией SSE?Я имею в виду, что мне не нравится идея использовать выровненные векторы абсолютно везде вместо std :: vector на тот случай, если slm :: component в конечном итоге инкапсулируется в класс или структуру.

В качестве альтернативыбыстрая математика для векторной / матричной / графической математики, такая же, как SLMATH, была бы хороша, если бы она была где-то рядом.Использование 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 Ответ

1 голос
/ 02 марта 2012

Это может сработать, если вы, когда вы объявляете свою переменную, используете __declspec(align) в ваших объявлениях переменных, или заключаете их в структуру, которая объявляет себя выровненной должным образом.Я не использовал библиотеку, о которой идет речь, но похоже, что это может быть проблема, с которой вы столкнулись.

Ссылка для опции выравнивания может быть найдена здесь .

...