c++ - omp_set_num_threads 总是返回 0 并且我无法使用 omp_get_thread_num() 获取线程号

标签 c++ openmp

我有一个使用 omp 进行并行化的 C++ 类库。我注意到我的问题,因为它总是用完我处理器上的所有内核,不管 omp_set_num_threads(threadCount) 有什么作为输入。

所以在进行调查时,我意识到让 num_threads 工作的唯一方法是不使用 omp_set_num_threads() 方法,而是像这样在并行指令上设置 num_threads:

#pragma omp parallel num_threads(4)
{
   int i = omp_get_thread_num();
   printf_s("Hello from thread %d\n", i);
}

在上面的例子中,输出是:

Hello from thread 0
Hello from thread 0
Hello from thread 0
Hello from thread 0

如果我改为使用以下内容:

    omp_set_num_threads(4);
#pragma omp parallel //num_threads(4)
    {
        int i = omp_get_thread_num();
        printf_s("Hello from thread %d\n", i);
    }

输出是

Hello from thread 0
Hello from thread 0
Hello from thread 0
Hello from thread 0
Hello from thread 0
Hello from thread 0
Hello from thread 0
Hello from thread 0

但是,我创建了一个类型为 Win32 控制台应用程序的新项目,omp_set_num_threads 有效并且我得到了输出:

来自线程 0 的问候 来自线程 2 的问候 来自线程 1 的问候 来自线程 3 的问候

我不得不认为这与项目类型或项目上的某些参数有关。有谁知道它可能是什么?

最好的问候 理查德

最佳答案

我现在解决了这个问题,所以这个线程可以关闭,除非有人能回答为什么会这样,解释如下:

我遇到的问题是我的 C++ 项目属性页中的属性公共(public)语言运行时支持设置为无公共(public)语言运行时支持。我们更改了此设置,因为 visual studio 2010 不支持将此设置设置为“公共(public)语言运行时支持”的 C++ 应用程序的智能感知。但似乎需要设置才能使线程工作,正如我上面所解释的那样。

有人知道为什么吗?

最好的问候 理查德

关于c++ - omp_set_num_threads 总是返回 0 并且我无法使用 omp_get_thread_num() 获取线程号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4087852/

相关文章:

c++ - 为什么使用 2 位小数精度格式化的 0.125 显示 "0.12"而不是 "0.13"?

java - 嵌套未按预期在 Java 中工作

c++ - OpenMP:有条件地使用#pragma

c++ - 如何使用 xdevapi 通过 C++ 代码登录 MySQL?

c++ - WAVE 文件的恐惧失败

c++ - 如何让用户使用 OpenCV 选择视频录制设备(网络摄像头)?

c++ - 启用 openmp 时出错 - "ld: library not found for -lgomp"和 Clang 错误

multithreading - 在 SGE 上每个节点请求 "M"核心的整数倍

c++ - 使用 omp 并行使用引用的函数

parallel-processing - LSF 中的混合 MPI/OpenMP