Как вы указали в своем комментарии, добавление флага компилятора -fno-math-errno
дает вам огромное увеличение скорости.Что касается того, почему это происходит, ваш фрагмент кода показывает, что вы выполняете sqrt
через distance_norm = distance.norm();
.
. Это делает компилятор не установленным ERRNO
после каждого sqrt
(это сохраненная запись влокальная переменная потока), которая быстрее и позволяет векторизацию любого цикла, который делает это многократно. Единственный недостаток этого состоит в том, что потеря IEEE-соблюдения теряется.См. gcc man .
Еще одна вещь, которую вы можете попробовать, это добавить -march=native
и добавить -mfma
, если -march=native
не включит его для вас (кажется, я помню,что в некоторых случаях он не был включен native
и должен был быть включен вручную - проверьте детали ).И как всегда с Eigen, вы можете отключить проверку границ с помощью -DNDEBUG
.
SoA вместо AoS !!!Если производительность действительно является реальной проблемой, рассмотрите возможность использования одной матрицы 4xN для хранения позиций (и пусть Atom
сохранит индекс столбца вместо Eigen::Vector3d
).В небольшом фрагменте кода, который вы показали, это не должно иметь большого значения, но, в зависимости от остального кода, может привести к еще одному огромному увеличению производительности.