具有两个处理器组的C线程处理
我有一台带有AMD Threadripper 3990x的新电脑,它有64个内核和128个线程 现在Windows 10在一个处理器组中只能处理64个内核。所以现在Windows制造了两个处理器组 我编写了创建N个进程的软件。我按如下方式检查存在多少个进程:具有两个处理器组的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-
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个线程。下面的链接将更详细地介绍这两个选项的方法和权衡 请阅读此处的详细信息…
. 一些链接可能有助于让您的软件处理器组了解:
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
}