我有一些串行代码,用矩阵向量乘以分别表示为std::vector<std::vector<double>>
和std::vector<double>
的矩阵:
void mat_vec_mult(const std::vector<std::vector<double>> &mat, const std::vector<double> &vec,
std::vector<std::vector<double>> *result, size_t beg, size_t end) {
// multiply a matrix by a pre-transposed column vector; returns a column vector
for (auto i = beg; i < end; i++) {
(*result)[i] = {std::inner_product(mat[i].begin(), mat[i].end(), vec.begin(), 0.0)};
}
}
我想使用OpenMP并行化它,我正在尝试学习。从here开始,我了解了以下内容:
void mat_vec_mult_parallel(const std::vector<std::vector<double>> &mat, const std::vector<double> &vec,
std::vector<std::vector<double>> *result, size_t beg, size_t end) {
// multiply a matrix by a pre-transposed column vector; returns a column vector
#pragma omp parallel
{
#pragma omp for nowait
for (auto i = beg; i < end; i++) {
(*result)[i] = {std::inner_product(mat[i].begin(), mat[i].end(), vec.begin(), 0.0)};
}
}
}
这种方法没有带来任何提速;在选择正确的OpenMP指令方面,我将不胜感激。
答案 0 :(得分:1)
有几件事可以解释您缺乏看到性能改进的原因。最有前途的是:
这些并不是可以解释某些缺乏可伸缩性的唯一原因,但是鉴于您提供的信息有限,我认为它们是最有可能的罪魁祸首。