【发布时间】:2021-12-20 17:23:32
【问题描述】:
我有以下代码,我使用 openMP 并行化了这些代码:
#pragma omp parallel shared(matrix, result, vector) private(i, j)
{
#pragma omp for schedule(static)
for (i = 0; i < n; i++)
{
for (j = 0; j <= i && j < n; k++)
{
result[i] += matrix[i * n + j] * vector[j];
}
}
}
我已将上述 pragma 指令添加到 for 循环中,该循环计算矩阵和列向量的乘积。它确实加快了速度。但是,是否有更有效的方法来使用 OpenMP 加快速度? 我尝试了不同类型的计划静态、动态、运行时、引导、自动。对于大至 30000 x 30000 的矩阵,静态和自动似乎给出了最好的结果。如果 j>i,矩阵具有 matrix[i][j]=0 的属性
【问题讨论】:
-
for (j = 0; j <= i && j < n; k++)->for (j = 0; j <= i; j++)? -
请添加包含循环的完整函数。确保
result具有restrict限定符 -
在外循环中提前获取你的矩阵行。
const T* row = matrix + i*n;然后在内循环中访问row[j]。图像处理中的同类优化。除非优化器赶上来,否则应该会有所作为。
标签: c optimization parallel-processing openmp