Eigen3矩阵-矩阵乘法比自己的openmp并行化代码快30倍

时间:2019-01-18 09:24:46

标签: visual-c++ matrix-multiplication eigen3

我使用/ openmp / O2 / arch :: AVX在VS C ++ 2017上编译了以下代码。 当使用8个线程运行时,输出为:

dt_loops = 1562ms dt_eigen = 26毫秒

我期望A * B比自己的手工循环要快,但是我没想到会有如此大的差异。我的代码有什么问题吗?如果没有的话,Eigen3怎么能这么快呢?

我对使用OpenMP或任何其他并行化方法不是很有经验。我尝试了不同的循环顺序,但是下面的循环顺序最快。

#include <iostream>
#include <chrono>
#include <Eigen/Dense>

int main() {
    std::chrono::time_point<std::chrono::system_clock> start1, end1, start2, end2;

    int n = 1000;
    Eigen::MatrixXd A = Eigen::MatrixXd::Random(n, n);
    Eigen::MatrixXd B = Eigen::MatrixXd::Random(n, n);
    Eigen::MatrixXd C = Eigen::MatrixXd::Zero(n, n);

    start1 = std::chrono::system_clock::now();
    int i, j, k;
#pragma omp parallel for private(i, j, k)
    for (i = 0; i < n; ++i) {
        for (j = 0; j < n; ++j) {
            for (k = 0; k < n; ++k) {
                C(i, j) += A(i, k) * B(k, j);
            }
        }
    }
    end1 = std::chrono::system_clock::now();
    std::cout << "dt_loops = " << std::chrono::duration_cast<std::chrono::milliseconds>(end1-start1).count() << " ms" << std::endl;

    Eigen::MatrixXd D = Eigen::MatrixXd::Zero(n, n);

    start2 = std::chrono::system_clock::now();
    D = A * B;
    end2 = std::chrono::system_clock::now();
    std::cout << "dt_eigen = " << std::chrono::duration_cast<std::chrono::milliseconds>(end2-start2).count() << " ms" << std::endl;
}

0 个答案:

没有答案