Я хочу, чтобы SSE использовался для арифметики на моих 3D-плавающих векторах (96 бит). Однако я читал противоречивые мнения о том, что необходимо.SSE-выравнивание 3D-вектора
Некоторые статьи/сообщения говорят, что мне нужно использовать 4D-вектор и «игнорировать» 4-й элемент, некоторые говорят, что я должен украсить свой класс такими вещами, как __declspec(align(16))
, и переопределить оператор new
, а некоторые говорят, что компилятор достаточно умен, чтобы выровняйте вещи для меня (я действительно надеюсь, что это правда!).
Я использую библиотеку Eigen, но обнаруживаю, что класс «неподдерживаемый» AlignedVector3
не подходит для цели (например, деление на нулевые ошибки при выполнении компонентного разделения, lpNorm
функция включает в себя фиктивный 4-й элемент).
Множество статей, которые я прочитал, уже несколько лет, поэтому я надеюсь, что современные компиляторы/версии SSE/процессоры могут просто выровнять данные для меня или работать с не согласованными по 16 байт данными. Любые современные знания об этом будут высоко оценены!
Процессоры не могут просто уйти и начать выравнивать материал самостоятельно, они выполняют только то, что говорит код.Кроме того, если это возможно, остановите эту идею и вместо этого используйте SIMD по отдельным координатам, поэтому вам не нужно тратить 4-ю полосу (и, как правило, почти все работает лучше, так что векторы SIMD не предназначены для использования в качестве векторов linalg) – harold
Спасибо за комментарий (не понимаю, почему этот вопрос был занижен ...). В любом случае, я не уверен, что вы подразумеваете под «использованием SIMD по отдельным координатам» - вы имеете в виду объемную обработку нескольких 3D-векторов (что было бы круто, если это возможно)? Я также только что открыл C++ 11 'alignas (16)' decorator. Я добавил его, чтобы обернуть свой универсальный векторный класс, и он не вызвал сбой, но, конечно, не используется доказательство SIMD. – Dave
Да, массовая обработка, возможно, используйте 3 указателя (x, y, z) в блок, который вы получили с _aligned_malloc. Кроме того, при необходимости вы можете загрузить/сохранить неглавные. Вся эта декларативная процедура выравнивания не очень хорошо работает на всех материалах C++, например, если вы поместили этот тип в контейнер, он все равно сломается, если вы не используете пользовательский распределитель. – harold