The*_*ere 1 parallel-processing hpc openmp
为什么这个程序将结果打印为64而不是5000?如果在临界区更新count变量,我希望在任何给定的时间点只有一个线程可以访问它.因此,每个线程都能够增加计数,并产生结果5000,那么为什么我得到64代替?
#include <iostream>
#include <omp.h>
using namespace std;
int main()
{
int count = 0;
omp_set_num_threads(5000);
#pragma omp parallel
{
#pragma omp critical
{
count++;
}
}
cout << "count = " << count << endl;
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
正如迈克尔·杜塞尔所指出的那样,你得到64作为答案,因为你的实现只发布了64个线程.它可能使用内部默认值来限制最大线程数(尝试改变环境变量 OMP_THREAD_LIMIT,或者调用omp_get_thread_limit()以查看是否是这种情况.)
这种限制的原因是创建线程需要资源 - 每个线程必须有自己的堆栈空间,linux上的进程表条目等.这些不是在用户空间中调度的轻量级无状态Erlang线程.在使用gcc或icpc的8核系统上,由于缺少资源,将线程数设置为1024或更高,只是失败了,尽管设置系统参数可以改变这个限制.
在线程所需的资源和大多数单映像系统具有少于5000个内核的事实之间,在大多数系统上使用5000个线程可以实现的目标尚不清楚.