下面是一个简单的递归程序,每次递归调用都会将其拆分为两个.正如预期的那样,结果是2+4+8次调用rec,但线程数始终相同:两个,ID在0和1之间来回反弹.我希望每次递归调用都能保留id,最终会生成8个线程.到底发生了什么?代码有问题吗?

#include <stdio.h>
#include <omp.h>

void rec(int n) {
  if (n == 0)
    return;

  #pragma omp parallel num_threads(2)
  {
    printf("Currently at %d -- total %d\n", omp_get_thread_num(), omp_get_num_threads());
    rec(n - 1);
  }
}

int main() {
  omp_set_nested(1);
  rec(3);
}

推荐答案

您的代码按照OpenMP标准的预期工作.在OpenMP documentation中,你可以找到以下关于omp_get_num_threads的信息:

摘要:omp_get_num_threads routine 返回线程数

绑定:omp_get_num_线程区域的绑定区域是

效果:omp_get_num_threads routine 返回线程数

omp_get_thread_num具有相同的结合区域:

omp_get_thread_num区域的结合区域是innermost enclosing parallel region.

这意味着omp_get_num_threadsomp_get_thread_num只绑定到最里面的平行区域,所以不管使用多少嵌套的平行区域.每个并行区域由#pragma omp parallel num_threads(2)定义,因此omp_get_num_threads的返回值为2(只要有足够的线程可用),omp_get_thread_num的返回值为01.

C++相关问答推荐

strftime函数中%s的历史意义是什么?为什么没有记录?

ATTiny1606定时器TCA 0中断未触发

从组播组地址了解收到的数据包长度

为什么GCC在每次循环迭代时都会生成一个数组的mov&S使用[]访问数组?(-03,x86)

有没有可能我不能打印?(C,流程)

LONG_DOUBLE_T是否存在(标准C:C23)

以下声明和定义之间的区别

Setenv在c编程中的用法?

如何在提取的索引中分配空值?

编译器如何处理具有更复杂值的枚举?

接受任何参数的函数指针是否与接受不同参数的函数兼容

变量的作用域是否在C中的循环未定义行为或实现定义行为的参数中初始化?

将变量或参数打包到 struct /联合中是否会带来意想不到的性能损失?

Zlib:解压缩大文件导致";无效代码长度设置";错误

当我用scanf(&Q;%S%S%S&Q;,单词0,单词1,单词2)输入多个单词时,除了最后一个单词外,每个单词的第一个字符都丢失了

按字典顺序打印具有给定字符的所有可能字符串

从系统派生线程调用CRT

我怎样才能用c语言正常运行这两个进程?

strlen 可以是[[未排序]]吗?

如何根据当前舍入方向将float转换为int?