Eigen :: Matrix vs. boost :: multi_array vs. Eigen :: Map

时间:2013-06-07 19:07:03

标签: c++ performance eigen boost-multi-array

我在完成相当简单的任务时会得到令人费解的结果:

  • 征::矩阵
  • 升压::的multi_array
  • boost :: multi_array使用Eigen :: Map
  • 映射到Eigen :: Matrix

这是我的测试代码的删节版本;更完整的版本可以在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更快,因为sum变为矢量化,而使用原始boost :: multi_array则不然。

我的问题是:

  1. 为什么boost :: multi_array没有矢量化,而Eigen :: Matrix是?
  2. 为什么映射到Eigen的multi_array比“native”本征数据结构更快?
  3. 对于编译,我使用以下内容:

    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
    

    感谢您的回答。

0 个答案:

没有答案