Выравнивание памяти G ++ SSE в стеке

Я пытаюсь переписать трассировщик лучей, используя Streaming SIMD Extensions. Мой первоначальный трассировщик лучей использовал встроенную сборку и инструкции movups для загрузки данных в регистры xmm. Я читал, что встроенные функции компилятора не намного медленнее, чем встроенная сборка (я подозреваю, что могу даже увеличить скорость, избегая невыровненных обращений к памяти), и гораздо более переносимы, поэтому я пытаюсь перенести свой код SSE на использование встроенных функций в xmmintrin.h . Основным затронутым классом является vector, который выглядит примерно так:

#include "xmmintrin.h"
union vector {
    __m128 simd;
    float raw[4];
    //some constructors
    //a bunch of functions and operators
} __attribute__ ((aligned (16)));

Я читал ранее, что компилятор g ++ автоматически выделяет структуры по границам памяти, равным размеру самой большой переменной-члена, но это не похоже на происходит, а атрибут выравнивания не помогает. Мои исследования показывают, что это вероятно потому, что я выделяю в стеке целую кучу локальных векторов функций, и что выравнивание в стеке не гарантируется в x86. Есть ли способ заставить это выравнивание? Я должен упомянуть, что он работает под родным Linux x86 на 32-битной машине, а не под Cygwin. Я намерен реализовать многопоточность в этом приложении в дальнейшем, поэтому объявление вызывающих ошибку экземпляров вектора статическими не является вариантом. При необходимости я готов увеличить размер своей векторной структуры данных.

12
задан Octavianus 11 February 2011 в 05:03
поделиться