2016-02-14 2 views
0

Я использую Ubuntu 14.04 на ядре i5. Следующий код был протестирован на разных компьютерах с очень быстрым временем выполнения (3258 мс), но в моей системе он занимает 112921 мс. Я использую g ++ в качестве компилятора.Почему Eigen's Cholesky очень медленно разлагается на моем Ubuntu

#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; 

} 
+4

Скомпилировать с -O2 или -O3. –

+0

Спасибо, это сработало :) –

ответ

0

Когда вы скомпилируете программу в режиме отладки (например, g++ -std=c++11), многое происходит под капотом. Вспомните, какую информацию вы видите, когда происходит сбой. Вся эта информация и домашнее хозяйство требуют времени.

По этой причине, когда ваша программа протестирована и работает нормально, вам больше не нужно домашнее хозяйство, вы хотите, чтобы производительность вступила в игру.

Использовать optimization flags, как O1, O2 или O3 (there are more). Какой из них использовать? Тяжело зависит от вашего приложения, поэтому экспериментируйте, по крайней мере, с этими тремя вариантами.


Примечание: Убедитесь, что вы используете капитал Omikron, в противном случае (если вы наберете в нижнем регистре Omikron или ноль), вы думаете, что вы компилируетесь код с оптимизацией включена, но он все равно компилируется в режиме отладки.

снабжает Gcc tutorial:

Генерировать символьную информацию для GDB и много предупреждающих сообщений.

g++ -g -Wall myprog.C -o myprog 

Сгенерировать оптимизированный код на машине Solaris с предупреждениями. -O - ​​капитал o, а не число 0!

g++ -Wall -O1 -mv8 myprog.C -o myprog 
0

Я предполагаю, что вы компилируетесь в режиме отладки без оптимизации.

Если вы используете CMake, создайте с помощью cmake -DCMAKE_BUILD_TYPE=Release или cmake -DCMAKE_BUILD_TYPE=ReleaseWithDebugInfo. В противном случае попробуйте добавить флаг оптимизации -O3 к компилятору g ++.

Смежные вопросы