我对矩阵矢量乘法感兴趣。我正在分析矩阵向量乘法的速度。一个函数将矩阵表示为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为向量。