OpenMP: скорость двух способов умножения матрицы на вектор - PullRequest
1 голос
/ 18 мая 2019

Меня интересует умножение матрицы на вектор.Я анализирую скорости умножения матричного вектора.Одна функция представляет матрицу в виде 1d массива, а другая функция представляет ее в виде 2d массива.2d массив всегда быстрее, когда я его запускаю.Я не могу понять, почему.

Я пробовал рецензировать книги.

Матрица как массив 1d:

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;
        }
    }

}

Матрица как массив 2d:

/*
 * 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 - вектор.

...