使用omp_set_num_threads()更少的线程更新值

时间:2014-06-19 04:31:13

标签: parallel-processing openmp hpc

为什么这个程序将结果打印为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;
}

2 个答案:

答案 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。