C ++中带有矢量化的矩阵乘法执行时间很长

时间:2019-08-07 11:58:19

标签: c++ vectorization matrix-multiplication

我想在允许使用矢量化的c ++中乘以几个矩阵。但是,以下代码会导致较大的执行时间〜858146125 ns。我如何修改代码,以便对矩阵乘法进行矢量化处理并达到大约100ns的执行时间。 我正在使用O3标志。

   const int ROWS = 1000;
    const int COLS = 1000;
    const int ROWS1 = 1000;
    const int COLS1 = 1000;
    const int l = 1000;
    double random_matrix[ROWS][COLS];
    double random_matrix1[ROWS1][COLS1];

    double mult[l][l];
    int i;
    int j;
    /* generate number: */
    for (i = 0; i < ROWS; i++) {
        for (j = 0; j < COLS; j++)
            random_matrix[i][j] = i + j;
    }
    for (i = 0; i < ROWS1; i++) {
        for (j = 0; j < COLS1; j++)
            random_matrix1[i][j] = i + j;
    }

    auto start = std::chrono::steady_clock::now();
    for (size_t row = 0; row < ROWS; ++row) {
        for (size_t tmp = 0; tmp < COLS1; ++tmp) {
            mult[row][tmp] = random_matrix[row][0]*random_matrix1[0][tmp];
            for (size_t col = 1; col < COLS; ++col) {
                mult[row][tmp] += random_matrix[row][col] * random_matrix1[col][tmp];
            }
        }
    }

    auto end = std::chrono::steady_clock::now();
    std::cout << "Elapsed time in nanoseconds : "
              << std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count()
              << " ns" << std::endl;

    std::cout<<"\n";
    for (i=0;i<ROWS;i++)
    {
        for (j=0;j<COLS1;j++)
            std::cout << mult[i][j] <<std::endl; //display table
        std::cout<<"\n";
    }


1 个答案:

答案 0 :(得分:3)

恐怕无论有矢量化或无矢量化,使用这些矩阵大小,您将永远无法达到100 ns的总执行时间。两个矩阵1000 x 1000元素的矩阵乘法的数量级为1000 ^ 3 = 1,000,000,000乘法加法。那是十亿次手术。

第二,如果性能对您来说非常重要,则不应为这些低级数学基元编写自己的代码。有优化的C ++库可以为您执行这些操作,例如Eigen或BLAS(Intel MKL是实现BLAS的软件包)。

通过使用这些软件包之一,您不仅可以获得更好的性能,而且还避免了其他情况下可能出现的陷阱或错误。