Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parallel processing 使用omp_set_num_threads()更新值的线程数少于预期值_Parallel Processing_Openmp_Hpc - Fatal编程技术网

Parallel processing 使用omp_set_num_threads()更新值的线程数少于预期值

Parallel processing 使用omp_set_num_threads()更新值的线程数少于预期值,parallel-processing,openmp,hpc,Parallel Processing,Openmp,Hpc,为什么这个程序将结果打印为64而不是5000?如果count变量在critical部分被更新,我希望在任何给定的时间点只有一个线程可以访问它。因此,每个线程都可以增加计数,并生成结果5000,那么为什么我的答案是64呢 #include <iostream> #include <omp.h> using namespace std; int main() { int count = 0; omp_set_num_threads(5000); #p

为什么这个程序将结果打印为64而不是5000?如果count变量在critical部分被更新,我希望在任何给定的时间点只有一个线程可以访问它。因此,每个线程都可以增加计数,并生成结果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;
}
#包括
#包括
使用名称空间std;
int main()
{
整数计数=0;
omp_设置_数量_线程(5000);
#pragma-omp并行
{
#pragma-omp-critical
{
计数++;
}
}

cout可以使用omp_set_num_线程设置的值不是未授权的。 这取决于您使用的OPEMP实现、计算机的内核数等


您得到64个线程,因为当前线程组中应该有64个线程。您可以使用omp_get_num_threads进行检查。

您可以使用omp_set_num_threads设置的值不是未经许可的。 这取决于您使用的OPEMP实现、计算机的内核数等


您得到64个线程是因为当前线程团队中应该有64个线程。您可以使用omp_get_num_threads进行检查。

正如Michael Dussere指出的,您得到的答案是64个线程,因为您的实现只启动了64个线程。它可能使用内部默认值来限制最大线程数(请尝试更改环境变量
OMP\u THREAD\u LIMIT
,或调用
OMP\u get\u THREAD\u LIMIT()
,查看是否存在这种情况。)

这种限制的原因是创建线程需要资源——每个线程都必须有自己的堆栈空间、linux上的进程表条目等。这些不是在用户空间中调度的轻量级无状态Erlang线程。在我使用gcc或icpc的8核系统上,将线程数设置为1024或以上的任何值都会失败虽然设置系统参数可以改变这一限制,但由于缺乏资源


线程所需的资源和大多数单映像系统的内核明显少于5000个的事实之间,不清楚在大多数系统上使用5000个线程可以实现什么。

正如Michael Dussere指出的,您得到的答案是64个,因为您的实现只启动了64个线程可能正在使用内部默认值限制最大线程数(请尝试更改环境变量
OMP\u THREAD\u limit
,或调用
OMP\u get\u THREAD\u limit()
,查看是否存在这种情况。)

这种限制的原因是创建线程需要资源——每个线程都必须有自己的堆栈空间、linux上的进程表条目等。这些不是在用户空间中调度的轻量级无状态Erlang线程。在我使用gcc或icpc的8核系统上,将线程数设置为1024或以上的任何值都会失败虽然设置系统参数可以改变这一限制,但由于缺乏资源


在线程所需的资源和大多数单映像系统的内核明显少于5000个的事实之间,不清楚在大多数系统上使用5000个线程可以实现什么。

Jonathan Dursi,那么我如何添加两个数组,每个数组包含5000个元素?64个线程如何执行5000个元素的SIMD加法ents?@user3670482,只需使用
omp parallel for
,不必担心线程的数量;分解将为您完成,每个线程将处理多个项目。这是OpenMP中常用的方法-这不是CUDA,甚至不是SIMD(在4.0中也可以通过OpenMP调用,但是独立的)-这是一种粗粒度的并行,线程处理多个项目通常是这样,甚至是性能所必需的。Jonathan Dursi,那么我如何添加两个数组,每个数组包含5000个元素?64个线程如何执行5000个元素的SIMD添加?@user3670482,只需使用
omp parallel for
,不必担心数量r线程;分解将为您完成,每个线程将处理多个项目。这是OpenMP中常用的方法-这不是CUDA,甚至不是SIMD(在4.0中也可以通过OpenMP调用,但是独立的)-这是一种粗粒度的并行性,线程处理多个项目是常见的,甚至是性能所必需的。