gpt4 book ai didi

c - 在 openmp 中嵌套 for 循环

转载 作者:太空宇宙 更新时间:2023-11-04 04:15:17 24 4
gpt4 key购买 nike

使用 openmp 对 3 个嵌套 for 循环进行并行化的正确方法是什么?这样:

#pragma omp parallel for
for (i=0;i<SIZE;i++)
for(j=0;j<SIZE;j++)
for(k=0;k<SIZE;k++)
mresult[i][j]=mresult[i][j] + matrixa[i][k]*matrixb[k][j];

或者这样

  #pragma omp parallel for
for (i=0;i<SIZE;i++)
#pragma omp parallel for
for(j=0;j<SIZE;j++)
#pragma omp parallel for
for(k=0;k<SIZE;k++)
mresult[i][j]=mresult[i][j] + matrixa[i][k]*matrixb[k][j];

最佳答案

第二个完全不正确,因为存在竞争条件。此外,嵌套 parallel 通常不是一个好主意,因为它通常会产生比内核更多的线程,从而导致性能不佳。

如果 SIZE 足够大以暴露足够多的并行工作,那么第一行就可以了。通常,并行化最外层的循环是最好的,因为相同的并行化开销需要更多的工作。如果最外层的循环没有足够的并行性,可以考虑添加 collapse(2) - 这是并行化循环的正确方法,尽管在这种情况下没有必要。

总而言之,如果您想要性能矩阵乘法,请使用 tim18 指示的库。从矩阵乘法中获得最佳效率非常复杂,超出了本答案的范围。

正如 Z-Boson 指出的那样,您的第一个版本也不正确,因为默认情况下内部循环变量是共享的。您可以将它们标记为 private(j,k) 或更好,但只需在循环中定义它们,这样更清晰:

#pragma omp parallel for
for (int i=0;i<SIZE;i++)
for (int j=0;j<SIZE;j++)
for (int k=0;k<SIZE;k++)

关于c - 在 openmp 中嵌套 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52914637/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com