【发布时间】:2021-07-28 04:24:44
【问题描述】:
我正在做一个项目,我必须创建一个并行 for 循环和矩阵乘法。代码由 3 个公共变量 A、B、C 组成,其中 A、B 是我将相乘的数组的值,变量 C 是结果所在的数组。例如,当我使用静态调度时,执行时间以秒为单位是正常的
threads | Average (time)
1 | 89 (sec)
2 | 58 (Sec)
3 | 49 (sec)
4 | 42 (sec)
但是当我使用动态调度时,我会在执行中等待很长时间,例如使用 4 个线程时,我得到了这些结果,这与线程较少的平均时间有关。
threads | Average (time)
4 | 289(sec)
所以我的问题是,这个平均时间动态安排正常吗?如果不是,我怎么能让它更快或更好。值得一提的是,在下面的代码中,当我尝试并行第一个或第二个循环时,我有动态调度的逻辑平均时间,为什么会发生这种情况? 我在代码中的解释。我在那里使用临界区,因为线程正在更新数组的相同位置。
代码
for (i = 0; i < N; i++) // loop1
for (j = 0; j < N; j++) // loop2
{
#pragma omp parallel for num_threads(NUM_THREADS) \
schedule(static) reduction(+:sum) firstprivate(i,j)
for (k = sum = 0; k < N; k++) // loop3
sum += A[i][k]*B[k][j];
#pragma omp critical
C[i][j] = sum;
};
我知道我可以忽略 sum 并使用 C[i][j] 代替它,但我必须保持这样的代码。那么谁能告诉我我是否可以做得更好,或者动态时间表中的那些时间是否正好在第三个循环中
操作系统:Linux
核心数:4
【问题讨论】:
标签: c multithreading performance parallel-processing openmp