Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
具有两个处理器组的C线程处理_C_Multithreading_Numa - Fatal编程技术网

具有两个处理器组的C线程处理

具有两个处理器组的C线程处理,c,multithreading,numa,C,Multithreading,Numa,我有一台带有AMD Threadripper 3990x的新电脑,它有64个内核和128个线程 现在Windows 10在一个处理器组中只能处理64个内核。所以现在Windows制造了两个处理器组 我编写了创建N个进程的软件。我按如下方式检查存在多少个进程: SYSTEM_INFO sysi; GetSystemInfo(&sysi); klas->thread_maxcore = min(sysi.dwNumberOfProcessors, MAX_THREADS); klas-

我有一台带有AMD Threadripper 3990x的新电脑,它有64个内核和128个线程

现在Windows 10在一个处理器组中只能处理64个内核。所以现在Windows制造了两个处理器组

我编写了创建N个进程的软件。我按如下方式检查存在多少个进程:

SYSTEM_INFO sysi;
GetSystemInfo(&sysi);
klas->thread_maxcore = min(sysi.dwNumberOfProcessors, MAX_THREADS);
klas->thread_max = klas->thread_maxcore;
如何调整代码以使用所有128个线程?使用当前代码,一次只能运行64个进程,因此只能使用一个处理器组。

如何调整代码以使用所有128个线程

简而言之,要么让您的软件处理器组知道,要么强制您的配置只有一个处理器组

正如您所注意到的,Windows默认情况下,当看到超过64个线程时,会将它们分成处理器组。这可能就是为什么你看到的是一个较小的线程数。虽然线程数小于预期值,但它可能仅代表系统线程总数的一部分

同时多线程有一个设置,默认情况下,在Windows 10中,该设置处于启用状态。对于64核处理器,当同时多线程功能启用时,系统将显示128个线程,但这些线程分为两组。此默认Windows行为可能会阻止您查看(具有可见性)所有线程。关于您的具体要求,我必须如何调整代码以使用所有128个线程

…当程序在组内运行时,除非它是处理器 组感知,则它只能访问同一组中的其他线程

因此,答案是让您的软件处理器组感知,或者通过禁用同步多线程,设置将所有内核放入单个处理器组,从而允许您的软件生成所有128个线程。
下面的链接将更详细地介绍这两个选项的方法和权衡

请阅读此处的详细信息…
.

一些链接可能有助于让您的软件处理器组了解:

<> >摘录>前一个链接的代码> C++< /代码>代码(此问题被标记为代码> C++ <代码>,将其视为伪代码)

void DistributeThreads(void)
{
#如果操作系统是WINDOWS 64
//!!BUG!!旧windows版本需要跳过此代码
int nNumGroups=GetActiveProcessorGroupCount();
如果(nNumGroups>1)
{
日志(“系统有%d个处理器组”,nNumGroups);
对于(int i=0;i

注意:在MSDN中搜索函数定义,例如:

@JohnBollinger-我已经编辑过了,相信内容现在与OP问题更相关。谢谢。从未使用过c中的处理器组。。。你能给我举个简单的例子吗?@Felix-你看过链接中的示例代码了吗?它们都提供了足够详细的解释,并提供了代码来说明。:)(请参见回答中的编辑。)您有什么特定版本/类型的
Windows 10
?它们在处理器上的表现各不相同。(正如下面的链接中所指出的)我使用w10,并考虑使用一些最新的。他们对NUMA的支持可能会更好地应用于您的新PC上,并在中编写代码,或者哪个具有更好的、与平台无关的多线程
void DistributeThreads(void)
{
#if OS_WINDOWS_64
    //!!BUG!! need to skip this code for old windows versions
        int nNumGroups = GetActiveProcessorGroupCount();
    if ( nNumGroups > 1 )
    {
        Log( "System has %d processor groups", nNumGroups );
        for(int i = 0; i < nNumGroups; i++ )
        {
            Log(" group %d has %d processors", i, ( int ) GetMaximumProcessorCount( i ) );
        }
        int nCurGroup = 0;
        int nNumRemaining = GetMaximumProcessorCount( nCurGroup );
        for( int i = 0; i < m_threads.size(); i ++ )
        {
            auto hndl = m_threads[i].native_handle();
            GROUP_AFFINITY oldaffinity;
            if ( GetThreadGroupAffinity( hndl, &oldaffinity ) )
            {
                //Log( "thread %d, old msk = %x, old grp = %llx", i, oldaffinity.Mask, oldaffinity.Group );
                GROUP_AFFINITY affinity;
                affinity = oldaffinity;
                if ( affinity.Group != nCurGroup )
                {
                    affinity.Group = nCurGroup;
                    auto bSucc = SetThreadGroupAffinity( hndl, &affinity, nullptr );
                    if ( ! bSucc )
                    {
                        Log( "failed to set gr aff err=%x", (int) GetLastError() );
                    }
                    else
                    {
                        //Log( "Set group for thread %d to %d", i, nCurGroup );
                    }
                    --nNumRemaining;
                    if ( nNumRemaining == 0 )
                    {
                        nCurGroup = min( nCurGroup + 1 , nNumGroups - 1 );
                        nNumRemaining = GetMaximumProcessorCount( nCurGroup );
                    }
                }
            }
        }
    }
#endif
}