如何使用 openMP 将顺序程序转换为并行程序?
how can i convert a sequential program to parallel using openMP?
我开始使用 openMP,我想并行化这部分代码:
for (i=0 ;i<n ;i++)
for (j=1 ;j<n ;j++)
A[i][j]+=A[i][j-1];
如何使这个 for
并行?
我建议您先查看以下内容 link: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 link编辑,然后 运行 并行,或者编译时忽略 pragmas在这种情况下,程序应该仍然是有效的顺序程序。
在这种情况下,pragma
将多少线程的决定权交给了 运行 运行时。运行时通常根据机器中的内核数量做出决定。外部循环将被并行化,每个 i
迭代在概念上将由不同的线程执行。这很重要,因为您在各种 j
迭代之间具有数据依赖性,并且 communication/synchronization 并行是棘手的。将内部循环保持在一个线程中可以解决这个问题。 shared
部分可以省略,因为默认情况下共享内容。但正是出于这个原因,您 不应该 将其遗漏:明确说明您想要共享的内容和想要私有的内容。这是避免编写并行代码时发生的许多错误的好方法。
我开始使用 openMP,我想并行化这部分代码:
for (i=0 ;i<n ;i++)
for (j=1 ;j<n ;j++)
A[i][j]+=A[i][j-1];
如何使这个 for
并行?
我建议您先查看以下内容 link: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 link编辑,然后 运行 并行,或者编译时忽略 pragmas在这种情况下,程序应该仍然是有效的顺序程序。
在这种情况下,pragma
将多少线程的决定权交给了 运行 运行时。运行时通常根据机器中的内核数量做出决定。外部循环将被并行化,每个 i
迭代在概念上将由不同的线程执行。这很重要,因为您在各种 j
迭代之间具有数据依赖性,并且 communication/synchronization 并行是棘手的。将内部循环保持在一个线程中可以解决这个问题。 shared
部分可以省略,因为默认情况下共享内容。但正是出于这个原因,您 不应该 将其遗漏:明确说明您想要共享的内容和想要私有的内容。这是避免编写并行代码时发生的许多错误的好方法。