5

我有这个老问题,但网上没有适合我的答案,代码是:

#include "stdio.h"
#include "omp.h"

main ()
{
    omp_set_num_threads(4); //initialise thread count for 4 core cpu                                                                                                                             
    int j;
    printf ("%d\n", omp_get_max_threads());
    printf ("%d\n", omp_get_num_threads());
#pragma omp parallel for
    for (int j=0; j<10; ++j)
        {
            printf ("%d\n", omp_get_num_threads());
            int threadNum;
            threadNum = omp_get_thread_num();
            printf("This is thread %d\n", threadNum);
        }
    }
    return 0;
}

在 G++ 4.4.5、linux 2.6.32-5-amd64 中,它产生:

4
1
1
This is thread 0
1
This is thread 0
1
This is thread 0
1
This is thread 0
1
This is thread 0
1
This is thread 0
1
This is thread 0
1
This is thread 0
1
This is thread 0
1
This is thread 0

如果我们转移到 ICC 12.1.0,它会给我:

4
1
4
This is thread 0
4
This is thread 0
4  
This is thread 0
4
This is thread 1
4
This is thread 1
4
This is thread 1
4
This is thread 2
4 
This is thread 2
4
This is thread 3
4
This is thread 3

有任何想法吗?

4

4 回答 4

20

我从未见过omp_get_num_threads()使用gcc工作。
我使用自己的例程来计算正在运行的线程数:

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

int omp_thread_count() {
    int n = 0;
    #pragma omp parallel reduction(+:n)
    n += 1;
    return n;
}

int main() {
    printf("%d, %d\n",omp_thread_count(),omp_get_num_threads());
    return 0;
}
于 2012-11-11T04:52:31.530 回答
11

正如所指出的,omp_get_num_threads()在顺序代码部分中总是返回 1。这是我想出的解决该限制的最简单方法:

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

int main(int argc, char **argv)
{
  #pragma omp parallel
  {
    #pragma omp single
    printf("num_threads = %d\n", omp_get_num_threads());
  }
  return 0;
}

编译-fopenmp并运行。输出应该是:

$ gcc -fopenmp test.c
$ ./a.out
num_threads = 4

当然,4这只是我的电脑默认显示的内容;在您的计算机上,它将打印默认的线程数(核心数,或者OMP_NUM_THREADS如果设置了环境变量的值)。

我测试了这个解决方案,发现它可以与 Linux 上的 gcc 4.8.5、Linux 上的 icc 18.0.1、macOS 上的 gcc 6.4.0 和 macOS 上的 clang 3.9.1 一起使用。

于 2018-04-01T21:23:21.320 回答
7

您几乎可以肯定在编译时忘记使用该-fopenmp标志。

于 2012-06-17T12:04:07.550 回答
5

在程序的连续部分中 omp_get_num_threads 返回 1。(https://gcc.gnu.org/onlinedocs/libgomp/omp_005fget_005fnum_005fthreads.html

只有在并行部分中,omp_get_num_threads 才会返回 1 以外的值。

我已经尝试过 gcc-4.9.1。尽管如此, omp_get_num_threads() 返回 1。

icc 和 gcc 对线程数的识别是不同的。

使用 icc-10,我可以使用 maxNumCompThreads(2) 来指定线程数。

于 2015-10-31T09:12:46.450 回答