Почему разложение Холецкого Эйген гораздо быстрее на Linux, чем на Windows?
Я заметил значительную разницу в производительности относительно разложения Холецкого с помощью Эйген Библиотека.
Я использую последнюю версию Eigen (3.2.1) со следующим исходным кодом:
#include <iostream>
#include <chrono>
#include <Eigen/Core>
#include <Eigen/Cholesky>
using namespace std;
using namespace std::chrono;
using namespace Eigen;
int main()
{
const MatrixXd::Index size = 4200;
MatrixXd m = MatrixXd::Random(size, size);
m = (m + m.transpose()) / 2.0 + 10000 * MatrixXd::Identity(size, size);
LLT<MatrixXd> llt;
auto start = high_resolution_clock::now();
llt.compute(m);
if (llt.info() != Success)
cout << "Cholesky decomposition failed!" << endl;
auto stop = high_resolution_clock::now();
cout << "Cholesky decomposition in "
<< duration_cast<milliseconds>(stop - start).count()
<< " ms." << endl;
return 0;
}
Я компилирую этот бенчмарк с g++ -std=c++11 -Wall -O3 -o bench bench.cc и запускаю его на Windows в первый раз (используя MinGW, [edit: GCC 4.8.1]) и на Linux (edit: GCC 4.8.1) во второй раз, но оба раза на одной и той же машине.
В Windows он дает мне:
Cholesky decomposition in 10114 ms.
Но на Linux I получить:
Cholesky decomposition in 3258 ms.
Это меньше трети времени, необходимого для Windows.
Есть ли что-то доступное в системах Linux, что Eigen использует для достижения этой скорости?
И если да, то как я могу сделать то же самое в Windows?
2 ответов:
Убедитесь, что вы используете 64-разрядную систему. Если это не так, то не забудьте включить инструкции SSE2 (- msse2), но производительность все равно не будет такой высокой, как в 64-битной системе, потому что доступно меньше регистров SSE.
Смотрите главную страницу Eigenздесь .
Цитата
Eigen успешно используется со следующими компиляторами:
GCC, версия 4.1 и новее. Очень хорошая производительность с GCC 4.2 и поновее.
MSVC (Visual Studio), 2008 и новее (the old 2.икс версии Eigen поддерживают MSVC 2005, но без векторизации).
компилятор Intel C++. Очень хорошая работа.
LLVM / CLang++ (2.8 и выше).
MinGW, новейшая версия. Отлично производительность при использовании GCC 4.
QNX-компилятор QCC.Аргумент
У вас может быть более свежая версия gcc (>=4.2), чем используется ваша версия MinGW...
Примечание
Просто в качестве дополнительной заметки, вы можете даже иметь версию MinGW, которая не является "недавней", так как ссылка также говорит:
Eigen является стандартным C++98 и поэтому теоретически должен быть совместим с любой совместимый компилятор. Всякий раз, когда мы используем какие-то нестандартные особенность, которая является необязательной и может быть отключенный.
Так что, возможно, ваша версия gcc использует новую оптимизирующую функцию, которой MinGW не обладает, и возвращается к другой, более медленной, альтернативе.
конечно, в конце концов, это может быть совершенно другое дело, это экспериментальная догадка, основанная на теории...
Comments