Почему разложение Холецкого Эйген гораздо быстрее на 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?

900   2  

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

    Ничего не найдено.