Меня интересует умножение матрицы на вектор.Я анализирую скорости умножения матричного вектора.Одна функция представляет матрицу в виде 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 - вектор.