Я пытаюсь перезаписать raytracer с помощью Streaming SIMD Extensions. Мой оригинальный raytracer использовал встроенную сборку и movups инструкции для загрузки данных в регистры xmm. Я прочитал, что внутренняя среда компилятора не значительно медленнее, чем встроенная сборка (я подозреваю, что могу даже увеличить скорость, избегая неприглашенных запросов к памяти) и гораздо более портативный, поэтому я пытаюсь перенести свой код SSE, чтобы использовать встроенные функции в xmmintrin.h, Первичным классом является вектор, который выглядит примерно так:
#include "xmmintrin.h"
union vector {
__m128 simd;
float raw[4];
//some constructors
//a bunch of functions and operators
} __attribute__ ((aligned (16)));
Я уже читал, что компилятор g++ автоматически выделяет структуры по границам памяти, равным размерам наибольшей переменной-члена, но это, похоже, не происходит, и выравниваемый атрибут не помогает. Мои исследования показывают, что это, вероятно, связано с тем, что я выделяю целую кучу функциональных локальных векторов в стеке, а выравнивание в стеке не гарантируется в x86. Есть ли способ заставить это выравнивание? Я должен упомянуть, что это работает под собственной x86 Linux на 32-битной машине, а не Cygwin. Я намерен реализовать многопоточность в этом приложении дальше по строке, поэтому объявление экземпляров оскорбительных векторов как статических не является вариантом. Я желаю увеличить размер моей структуры векторных данных, если это необходимо.