Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.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
OpenMp没有';t使用所有CPU(双插槽、windows和Microsoft visual studio)_Windows_Visual Studio_Multiprocessing_Openmp - Fatal编程技术网

OpenMp没有';t使用所有CPU(双插槽、windows和Microsoft visual studio)

OpenMp没有';t使用所有CPU(双插槽、windows和Microsoft visual studio),windows,visual-studio,multiprocessing,openmp,Windows,Visual Studio,Multiprocessing,Openmp,我有一个双插槽系统,每个CPU有22个实核,或者每个CPU有44个超线程。我可以让openMP完全利用第一个CPU(22核/44超),但我无法让它利用第二个CPU 我正在使用CPUID HWMonitor检查我的核心使用情况。第二个CPU在所有内核上始终处于或接近0% 使用: int nProcessors = omp_get_max_threads(); 让我知道nProcessors=44,但我认为它只是使用了1个CPU的44个超线程,而不是44个真正的内核(应该是88个超线程) 看了很多

我有一个双插槽系统,每个CPU有22个实核,或者每个CPU有44个超线程。我可以让openMP完全利用第一个CPU(22核/44超),但我无法让它利用第二个CPU

我正在使用CPUID HWMonitor检查我的核心使用情况。第二个CPU在所有内核上始终处于或接近0%

使用:

int nProcessors = omp_get_max_threads();
让我知道nProcessors=44,但我认为它只是使用了1个CPU的44个超线程,而不是44个真正的内核(应该是88个超线程)

看了很多遍之后,我不知道如何使用其他CPU

我的CPU运行良好,因为我可以运行其他利用所有CPU的并行处理程序


我是用64位编译的,但我认为这无关紧要。此外,我正在使用Visual studio 2017专业版15.2。打开MP 2.0(仅支持一个vs)。在64位windows 10 Pro上运行,带有2个Intel Xeon E5-2699v4@2.2Ghz处理器。

因此,感谢@AlexG提供的一些见解,回答我自己的问题。请参阅问题的评论部分

这是Microsoft Visual Studio和Windows的问题

第一读

基本上,如果您的逻辑核不到64个,这不会是一个问题。但是,一旦您完成了这一步骤,现在每个套接字(或Windows选择的其他组织)将有两个进程组。在我的例子中,每个进程组有44个超线程,代表一个物理CPU套接字,而我正好有两个进程组。默认情况下,每个进程(程序)只能访问一个进程组,因此我最初只能在一个核心上使用44个线程。但是,如果手动创建线程并使用SetThreadGroupAffinity将线程的处理器组设置为与程序最初分配的组不同的处理器组,则程序现在成为多处理器组。这似乎是启用多处理器的一种迂回方式,但确实是这样做的。对GetProcessGroupAffinity的调用将显示,一旦开始设置每个线程的单个进程组,组的数量将大于1

我能够像这样创建一个开放的MP块,并遍历和分配流程组:

#pragma omp并行num_线程(88)
{
句柄线程=GetCurrentThread();
if(omp\u get\u thread\u num()>32)
{
//如果重复使用结构,则每次使用后必须将保留设置为零。。。
GroupAffinity1.保留[0]=0;
GroupAffinity1.保留[1]=0;
GroupAffinity1.保留[2]=0;
组亲和力1。组=0;

GroupAffinity1.Mask=1提及您正在使用的操作系统以及您正在使用的编译器和OpenMP版本/实现可能会有所帮助。您可以使用
omp\u set\u num\u threads
omp\u set\u dynamic(false)强制执行线程数
禁用动态团队。不过,我不确定在2插槽设置中如何操作。也许可以给出一点答案?您可以设置线程数,它的行为很好,线程的分配方式取决于操作系统。操作系统可能试图将它们都放在同一个CPU上,以确保更快的内存访问,我真的不知道Windows是如何操作的在多套接字机器上有(或者哪种版本甚至支持它-我想不是所有版本都支持)。@AlexG:我将num_线程设置为44和88(以防它认为超线程是线程?)当omp_设置_dynamic为false时,它仍然没有使用其他CPU。您提到的帖子是由于linux内核的错误,这与Qubit可能提到的Windows如何处理事情有关。这就是为什么我有点不知所措,不知道我还能做些什么来帮助解决这个问题。我现在应该作为max t获得44个线程吗线程?或者应该是88?我不确定。@Marvg您可能想阅读,并且。不确定OMP_PLACES是在哪个版本中出现的(我认为是OpenMP 4.0),但这似乎与您的情况有关。我很高兴您能找到一些东西。如果您确实需要性能,您可能希望在不使用超线程的情况下也进行一些测试。在最佳情况下,它将使性能提高15%,但如果您正在处理数字,很可能会使您的速度减慢一点。
#pragma omp parallel num_threads( 88 )
{
    HANDLE thread = GetCurrentThread();

    if (omp_get_thread_num() > 32)
    {
        // Reserved has to be zero'd out after each use if reusing structure...
        GroupAffinity1.Reserved[0] = 0;
        GroupAffinity1.Reserved[1] = 0;
        GroupAffinity1.Reserved[2] = 0;
        GroupAffinity1.Group = 0;
        GroupAffinity1.Mask = 1 << (omp_get_thread_num()%32);
        if (SetThreadGroupAffinity(thread, &GroupAffinity1, &previousAffinity))
        {
            sprintf(buf, "Thread set to group 0: %d\n", omp_get_thread_num());
            OutputDebugString(buf);
        }
    }
    else
    {
        // Reserved has to be zero'd out after each use if reusing structure...
        GroupAffinity2.Reserved[0] = 0;
        GroupAffinity2.Reserved[1] = 0;
        GroupAffinity2.Reserved[2] = 0;
        GroupAffinity2.Group = 1;
        GroupAffinity2.Mask = 1 << (omp_get_thread_num() % 32);
        if (SetThreadGroupAffinity(thread, &GroupAffinity2, &previousAffinity))
        {
            sprintf(buf, "Thread set to group 1: %d\n", omp_get_thread_num());
            OutputDebugString(buf);
        }
    }
}