关于多线程:openMp中的最大线程数

Maximum Threads in openMp

我不熟悉并行编程,想知道我可以启动的最大线程数是多少。

我试过这个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<stdio.h>
#include<omp.h>  
void pooh(int id,int a[])
{
    a[id]=a[id]-1 ;
    printf("%d
",id) ;
}
int main()
{
     int a[1001] ;
     int  i ;
     for(i=0;i<1000;i++)
    {
         a[i]=i+1 ;
    }
    omp_set_num_threads(1000) ;
    #pragma omp parallel
    {
        int id=omp_get_thread_num() ;
        pooh(id,a) ;
    }

    return 0 ;
 }

但是,当我尝试OMP设置线程数(10000);程序不运行。我想知道为完成一项工作可以启动的线程的最大数目。


您的问题:可以创建的最大线程数取决于您的系统。在Linux中,您可以使用cat /proc/sys/kernel/threads-max找到这一点。(参见Linux中每个进程的最大线程数?).

我认为你需要知道的是:但是,这不是你想要的,因为这会使你的系统超载。根据经验,您不需要超过系统中可用处理器的数量。您可以在Linux中使用nproc找到这一点(例如,如何从命令行获取Linux中的CPU/内核数量?).

使用超过系统中可用处理器数量的处理器将使应用程序运行速度变慢。


从你的问题陈述中,有两个方面你必须理解。要直接回答您的问题,建议设置的最大线程数是cores*超线程数。否则,线程只是在等待资源。通常是2、4、8、16……除非你打算在英特尔GPU上使用它,否则几乎不会有1000个。

第二个方面是我建议您更改实施策略。看一看:#pragma omp parallel for

或者自己分担工作量,尽管当omp可以自动完成时,为什么要这样做(除非是为了大学作业或其他事情)。