Eigen :: Матрица против boost :: multi_array vs. Eigen :: Карта

Я получаю удивительные результаты при выполнении довольно простых задач для сравнения производительности:

  • Эйген :: Матрица
  • повышение :: multi_array
  • boost :: multi_array сопоставляется с Eigen :: Matrix с использованием Eigen :: Map

Это сокращенная версия моего тестового кода; более полную версию можно найти по адресу: http://pastebin.com/faZ7TvJG.

boost::multi_array<double, 2, Eigen::aligned_allocator<double> > boost_multi_array;
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> eigen_matrix;
Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > boost_multi_array_mapped(boost_multi_array.data(), rows, cols);

double
tmp_sum = 0,
tmp_time = omp_get_wtime();

for(size_t i=0; i<iterations; i++)
{
for(size_t j=0; j<rows; j++)
{
for(size_t k=0; k<cols; k++)
{
//if(k%2==0)
//{ // commented out are the different options
//tmp_sum += boost_multi_array[j][k];
//tmp_sum += boost_multi_array_mapped(j,k);
tmp_sum += eigen_matrix(j,k);
//}
}
}
}

const double sequential_access_time = omp_get_wtime() - tmp_time;

Результаты приведены ниже:

Sequential Access:
BOOST (MAPPED)   : 1.45763s
EIGEN            : 1.45736s
BOOST            : 2.58971s

Если я использую оператор if для пропуска каждого второго элемента, я получу следующие результаты:

Alternating Access:
BOOST (MAPPED)   : 1.67301s
EIGEN            : 2.08834s
BOOST            : 2.35295s

Проверка сборки показывает, что в случае последовательного доступа Eigen быстрее, потому что сумма становится векторизованной, а не при использовании raw boost :: multi_array.

Мои вопросы тогда:

  1. Почему boost :: multi_array не векторизован, а Eigen :: Matrix — нет?
  2. Почему multi_array, сопоставленный с Eigen, будет быстрее, чем «собственная» структура данных Eigen?

Для компиляции я использую следующее:

g++ -I /usr/include/eigen3 test.cpp -Wall -O3 -DNDEBUG -DBOOST_DISABLE_ASSERTS -fopenmp -ffast-math -funroll-loops -march=native -mtune=native -o array_test

Спасибо за ваши ответы.

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]