我从openMP开始,我希望并行化这部分代码:
for (i=0 ;i<n ;i++)
for (j=1 ;j<n ;j++)
A[i][j]+=A[i][j-1];
如何使for
并行?
答案 0 :(得分:5)
我建议您先查看以下链接:http://bisqwit.iki.fi/story/howto/openmp/。 它简要概述了使用OpenMP可以实现的目标。
对于你的代码片段,并行化可以像编写一个pragma一样简单:
#pragma omp parallel for private(i, j) shared(A, n)
for (i = 0; i < n; ++i)
for (j = 1; j < n; ++j)
A[i][j] += A[i][j-1];
这就是OMP背后的想法:您使用消息注释您的程序,允许代码编译并与OMP链接然后并行运行,或编译忽略编译指示,在这种情况下程序应保持有效的顺序程序
在这种情况下,pragma
会决定运行到运行时的线程数。运行时通常根据计算机中的核心数量做出决策。外部循环将被并行化,并且每个i
迭代将在概念上由不同的线程执行。这很重要,因为您在各种j
次迭代之间存在数据依赖关系,并行通信/同步非常棘手。将内循环保持在线程中可以解决此问题。可以省略shared
部分,因为默认情况下共享内容。但出于这个原因,你确实不应该将其排除在外:明确你想要分享的内容以及你想要私密的内容。这是避免编写并行代码时发生的许多错误的好方法。