我是并行编程的新手,想知道我可以启动的最大线程数是多少。
我试过这个
#include<stdio.h>
#include<omp.h>
void pooh(int id,int a[])
{
a[id]=a[id]-1 ;
printf("%d\n",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_set_num_threads(10000)时; 程序没有运行。我想知道可以启动的最大线程数来完成工作。
答案 0 :(得分:2)
您的问题:您可以创建的最大线程数取决于您的系统。在Linux中,您可以使用cat /proc/sys/kernel/threads-max
找到它
(例如,Maximum number of threads per process in Linux?)。
我认为你需要知道什么:但是,这不是你想要的,因为这会使你的系统过载。根据经验,您不需要超过系统中可用处理器的数量。您可以在Linux中使用nproc
找到这一点(例如,参见How to obtain the number of CPUs/cores in Linux from the command line?)。
使用超过系统中可用处理器数量的应用程序将使您的应用程序运行得更慢。
答案 1 :(得分:1)
您必须从问题陈述中了解两个方面。要直接回答您的问题,建议设置的最大线程数是核心数量*超线程。否则线程只是等待资源。这通常是2,4,8,16 ..而且几乎从不1000,除非你打算在intel GPU上使用它。
第二个方面是我建议你改变你的实施策略。看一眼:
#pragma omp parallel for
或者自己划分工作量,但是当omp
可以自动执行此操作时,您为什么要这样做(除非是大学作业或其他什么)。