【发布时间】:2019-12-23 11:34:37
【问题描述】:
我想对外部分配的数据执行大量计算,尤其是矩阵乘法。可以通过Eigen::Map 完成。不幸的是,我不是向量化计算方面的专家,但据我所知,可以为Map 指定Aligned 标志。
我决定通过 Eigen::MatrixXf 和 'Eigen::Map' 检查矩阵乘法之间的性能差异:
void testMatProduct(
const Eigen::MatrixXf &a,
const Eigen::MatrixXf &b,
Eigen::MatrixXf &res)
{
const auto startTime = std::chrono::high_resolution_clock::now();
res.noalias() = a * b;
const auto endTime = std::chrono::high_resolution_clock::now();
const auto duration = std::chrono::duration_cast<std::chrono::microseconds>( endTime - startTime ).count();
std::cout << "Mat product elapsed " << duration / 1.0e6 << std::endl;
}
using EigenMap = Eigen::Map<Eigen::MatrixXf, Eigen::Unaligned>;
void testMapProduct(
const EigenMap &a,
const EigenMap &b,
EigenMap &res)
{
const auto startTime = std::chrono::high_resolution_clock::now();
res.noalias() = a * b;
const auto endTime = std::chrono::high_resolution_clock::now();
const auto duration = std::chrono::duration_cast<std::chrono::microseconds>( endTime - startTime ).count();
std::cout << "Map product elapsed " << duration / 1.0e6 << std::endl;
}
int main(int, char **)
{
srand(42);
const int64_t N = 7000;
const int64_t K = 6000;
const int64_t M = 100;
Eigen::MatrixXf mat1 = Eigen::MatrixXf::Random(N, K);
Eigen::MatrixXf mat2 = Eigen::MatrixXf::Random(K, M);
Eigen::MatrixXf matRes = Eigen::MatrixXf::Zero(N, M);
// Copy data from mats to vecs
Eigen::VectorXf vec1 = Eigen::Map<Eigen::MatrixXf>(mat1.data(), mat1.rows() * mat1.cols(), 1);
Eigen::VectorXf vec2 = Eigen::Map<Eigen::MatrixXf>(mat2.data(), mat2.rows() * mat2.cols(), 1);
Eigen::VectorXf vecRes = Eigen::VectorXf::Zero(N * M);
EigenMap map1 = EigenMap(vec1.data(), mat1.rows(), mat1.cols());
EigenMap map2 = EigenMap(vec2.data(), mat2.rows(), mat2.cols());
EigenMap mapRes = EigenMap(vecRes.data(), matRes.rows(), matRes.cols());
for(int i = 0; i < 10; ++i){
testMapProduct(map1, map2, mapRes);
testMatProduct(mat1, mat2, matRes);
matRes.setZero();
vecRes.setZero();
}
return 0;
}
我很确定这不是一个有效的基准,但它应该给我一些直觉。我用-march=native 编译它并打印以下输出:
Map product elapsed 0.102751
Mat product elapsed 0.10224
Map product elapsed 0.10022
Mat product elapsed 0.100726
Map product elapsed 0.09963
Mat product elapsed 0.100697
Map product elapsed 0.099673
Mat product elapsed 0.100809
Map product elapsed 0.100195
.......
所以在我看来,地图乘积和矩阵乘积之间没有太大区别。
我的问题是:
1)Map<MatrixXf, Unaligned>和Map<MatrixXf, Aligned>在性能方面有什么区别?我是否应该关心 Map 对齐其他操作,如点积、元素加法等
2) 我的比较正确吗?
PS 对不起我的英语不好
【问题讨论】:
标签: c++ eigen matrix-multiplication memory-alignment eigen3