为什么这个程序将结果打印为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;
}
答案 0 :(得分:5)
正如迈克尔·杜塞尔所指出的那样,你得到64作为答案,因为你的实现只发布了64个线程。它可能使用内部默认值来限制最大线程数(尝试更改环境变量OMP_THREAD_LIMIT
,或调用omp_get_thread_limit()
以查看是否是这种情况。)
这种限制的原因是创建线程需要资源 - 每个线程必须有自己的堆栈空间,linux上的进程表条目等。这些不是在用户空间中调度的轻量级无状态Erlang线程。在使用gcc或icpc的8核系统上,由于缺少资源,将线程数设置为1024或更高,只是失败了,尽管设置系统参数可以改变这种限制。
在线程所需的资源和大多数单映像系统具有少于5000个内核的事实之间,在大多数系统上使用5000个线程可以实现的目标尚不清楚。
答案 1 :(得分:2)
您可以使用omp_set_num_threads设置的值不是无限制的。 这取决于您使用的OpemMP实现,计算机的核心数量等。
你得到64因为当前线程团队中应该有64个线程。您可以查看omp_get_num_threads。