OpenMP:矩阵向量乘法的两种方式的速度

时间:2019-05-18 08:19:18

标签: c++ matrix vector openmp

我对矩阵矢量乘法感兴趣。我正在分析矩阵向量乘法的速度。一个函数将矩阵表示为1d数组,另一个函数将其表示为2d数组。当我运行它时,二维数组总是更快。我不知道为什么。

我已经尝试过阅读书籍。

矩阵作为一维数组:

void matrix_mult_vector_v2(const double* A, const double* x, double* result, int n_rows, int n_cols) {

    int row, col;
    double sum ;


    #pragma omp parallel shared(A, x, result, n_rows, n_cols) private(row, col, sum)
    {
        #pragma omp for schedule(static)
        for (row = 0; row < n_rows ; row++) {
            sum = 0.0;

            for(col = 0; col < n_cols; col++){

                int i = col + row * n_cols;

                sum += A[i] * x[col];
            }

            result[row] = sum;
        }
    }

}

矩阵为二维数组:

/*
 * Matrix multiply vector
 * result = A * x where A is a matrix and x is a vector
 */

void matrix_mult_vector(double** A, double* x, double* result, int n_rows, int n_cols)
{

    int row, col;
    double sum;

    #pragma omp parallel shared(A, x, result, n_rows, n_cols) private(row, col, sum)
    {

        //#pragma omp parallel for collapse(2)
        #pragma omp for schedule(static)
        for (row = 0; row < n_rows ; row++) {
            sum = 0.0;

            for(col = 0; col < n_cols; col++){
                //#pragma omp atomic

                sum += A[row][col] * x[col];
            }

            result[row] = sum;
        }
    }
}

没有错误。结果应为A * x,其中A为矩阵,x为向量。

0 个答案:

没有答案