Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用一个线程执行节,使用多个线程执行for循环_C++_C_Parallel Processing_Openmp - Fatal编程技术网

C++ 使用一个线程执行节,使用多个线程执行for循环

C++ 使用一个线程执行节,使用多个线程执行for循环,c++,c,parallel-processing,openmp,C++,C,Parallel Processing,Openmp,我正在使用OpenMP,我希望生成线程,使一个线程执行一段代码并完成,与N个线程并行运行并行for循环的迭代 执行应该是这样的: Section A (one thread) || Section B (parallel-for, multiple threads) | || | | | | | | | | | | | || | | | |

我正在使用OpenMP,我希望生成线程,使一个线程执行一段代码并完成,与N个线程并行运行并行for循环的迭代

执行应该是这样的:

Section A (one thread)       ||      Section B (parallel-for, multiple threads)
         |                   ||        | | | | | | | | | |
         |                   ||        | | | | | | | | | |
         |                   ||        | | | | | | | | | |
         |                   ||        | | | | | | | | | |
         |                   ||        | | | | | | | | | |
         V                   ||        V V V V V V V V V V
我不能用
#pragma omp一次性编写并行for,因为我不希望执行部分a的线程执行for循环

我试过这个:

#pragma omp parallel sections {
    #pragma omp section
    {
         // Section A
    }

    #pragma omp section
    {
         // Section B;
         #pragma omp parallel for
         for (int i = 0; i < x; ++i)
             something();
    }
}
这允许for循环使用多个线程执行,但它使各部分不并行,并且第一部分在第二部分之前顺序执行


我需要的是两种方法的组合,其中for循环的每个迭代和第一部分都是并行运行的。

也许下面的代码可以做到这一点:

#pragma omp parallel for
for (int i = -1; i < x; ++i) {
    if (i==-1) {
        // Section A
    }
    else {
        // Section B
        something();
    }
}
#pragma omp parallel for
对于(int i=-1;i

但是,您需要确保x>=0。

嵌套并行必须显式设置,因为在大多数实现中默认情况下它是禁用的。根据OpenMP 4.0标准,必须设置
OMP\u嵌套的
环境变量:

OMP_嵌套环境变量通过以下方式控制嵌套并行性: 设置嵌套变量ICV的初始值。它的价值是什么 环境变量必须为true或false。如果环境 变量设置为true,启用嵌套并行;如果设置为 false,嵌套并行被禁用。程序的行为是 如果OMP_NESTED的值既不为true也不为true,则定义实现 错

以下行适用于bash:

 export OMP_NESTED=true
此外,正如@HristoIliev在下面的评论中所指出的,您很可能希望设置
OMP\u NUM\u THREADS
环境变量来调整性能。引用标准:

此环境变量的值必须是一个正值列表 整数值。列表的值将线程数设置为 用于对应嵌套级别上的平行区域

这意味着应该设置
OMP_NUM_THREADS
的值,类似于
n,n-1
,其中
n
是CPU内核的数量。例如:

export OMP_NUM_THREADS=8,7

对于8核系统(示例从下面的注释中复制)。

您是否尝试过具有不同活动的单个平行区域。例如 应该不需要嵌套并行性

#pragma omp_parallel 
{

#pragma omp task  
  once();

#pragma omp for 
  for(int i=0;i<N;i++){
    many(i);
  }

}
#pragma omp#u并行
{
#pragma-omp任务
一次();
#pragma omp for

对于(int i=0;但iOne应该注意,默认情况下,当启用嵌套并行时,嵌套的团队将由
OMP_NUM_线程
线程组成,因此执行
for
工作共享构造的其中一个线程可能会和执行部分A的线程分时共享。为了防止这种情况,应该设置
O的值MP_NUM_THREADS
类似于
n,n-1
,其中
n
是CPU核数,例如对于8核系统,
导出OMP_NUM_THREADS=8,7
#pragma omp_parallel 
{

#pragma omp task  
  once();

#pragma omp for 
  for(int i=0;i<N;i++){
    many(i);
  }

}