在执行相当简单的任务来比较以下性能时,我得到了令人费解的结果:
- 特征::矩阵
- boost::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 更快,因为总和变得矢量化,而在使用原始 boost::multi_array 时则不然。
那么我的问题是:
- 为什么 boost::multi_array 没有向量化,而 Eigen::Matrix 是?
- 为什么映射到 Eigen 的 multi_array 比“本机”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
感谢您的回答。