嵌套循环OpenMP Parallellizing,私有或公共索引?

时间:2018-06-18 12:02:56

标签: c++ c for-loop parallel-processing openmp

想象一下,在并行区域中有一个嵌套循环,如:

#pragma omp parallel
{
     for (int i = 0, ...) {
          for (int j = 0, ...) { }}}

#pragma omp parallel
{
     for (int i = 0, ...) {
          for (int j = i, ...) { }}}

如果我们使用#pragma omp,则i索引会自动变为私有。但是......我们是否需要将j索引设置为私有或公共?有什么影响?

#pragma omp parallel
{
     #pragma omp for shared(j)
     for (int i = 0, ...) {
           for (int j = 0, ...) { }}}

#pragma omp parallel
{
     #pragma omp for private(j)
     for (int i = 0, ...) {
          for (int j = 0, ...) { }}}

提前致谢!

2 个答案:

答案 0 :(得分:2)

并行区域内声明的所有内容都是自动隐私的。这(大概)是你想要的行为:i的每次迭代都应循环遍历所有jj循环都是独立的(因此是私有的,而不是公共的)。但是,您实际上缺少重要的parallel部分:如果您不写

#pragma omp parallel for

但仅

#pragma omp for

然后你不会并行发生任何事情(除非你首先在一个封闭的范围内创建了一个#pragma omp parallel的并行区域)!

答案 1 :(得分:1)

私有j没有效果,因为默认情况下j是私有的(因为它在i for循环中作用域,因此当创建新线程时j是特定于该线程的

services.AddSingleton<IAuthorizationHandler, IsAllowedAccessToA<RequirementA_OR_B>>();
services.AddSingleton<IAuthorizationHandler, IsAllowedAccessToB<RequirementA_OR_B>>();

如果你使用#pragma omp parallel for private(j) for (int i = 0, ...) { for (int j = 0, ...) { }} 它应该没有上面所述的效果,因为j的范围是i的每个实例的本地范围,如果你将j的范围扩展到全局,你将遇到一个种族密码