Я пытаюсь переписать трассировщик лучей, используя 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. Я намерен реализовать многопоточность в этом приложении в дальнейшем, поэтому объявление вызывающих ошибку экземпляров вектора статическими не является вариантом. При необходимости я готов увеличить размер своей векторной структуры данных.
std::aligned_storage
, вы можете получить выровненное хранилище переносимым способом, который также будет работать с другими компиляторами. - person James McNellis   schedule 11.02.2011std::aligned_storage
; Тем не менее, моя машина имеет g ++ 4.4.3, но есть вторая машина, на которой я надеялся запустить ее, которая заблокирована на 3.4.6. - person Octavianus   schedule 11.02.2011(float*)my_m128
небезопасно. Свойство «may-alias-something» векторных типов Intel действует только в одном направлении, а именно как вы можете получить доступ к чему-либо с помощьюchar*
, но не гарантируется безопасность доступа кchar[]
с помощьюint*
. (Это безопасно в MSVC, который похож наgcc -fno-strict-aliasing
, но в других компиляторах вы должны использовать объединения или перетасовать встроенные функции для доступа к элементам векторов.) См. печать переменной __m128i для примера. - person Peter Cordes   schedule 02.05.2019