我不熟悉并行编程,想知道我可以启动的最大线程数是多少。
我试过这个
#include
#include
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);程序不运行。我想知道为完成一项工作可以启动的线程的最大数目。
不确定这种方法是否明智,但您可以尝试使用二进制搜索-先尝试500,然后尝试250,然后尝试125,直到它工作为止。然后,您将知道数字的最低和最高界限,然后再次将该间隔拆分为两部分。
您的问题:可以创建的最大线程数取决于您的系统。在Linux中,您可以使用cat /proc/sys/kernel/threads-max找到这一点。(参见Linux中每个进程的最大线程数?).
我认为你需要知道的是:但是,这不是你想要的,因为这会使你的系统超载。根据经验,您不需要超过系统中可用处理器的数量。您可以在Linux中使用nproc找到这一点(例如,如何从命令行获取Linux中的CPU/内核数量?).
使用超过系统中可用处理器数量的处理器将使应用程序运行速度变慢。
从你的问题陈述中,有两个方面你必须理解。要直接回答您的问题,建议设置的最大线程数是cores*超线程数。否则,线程只是在等待资源。通常是2、4、8、16……除非你打算在英特尔GPU上使用它,否则几乎不会有1000个。
第二个方面是我建议您更改实施策略。看一看:#pragma omp parallel for
或者自己分担工作量,尽管当omp可以自动完成时,为什么要这样做(除非是为了大学作业或其他事情)。
我可以在OpenMP环境中使用Intel GPU吗?如果我有4个内核,这意味着我应该使用的最大线程数是4。所以,我需要将问题分为4个部分吗?
我建议pragma with for