我如何调整我的代码以使用所有 128 个线程
简短的回答是让您的软件处理器组知道,或者强制您的配置只有一个处理器组。
正如您所指出的,Windows 默认情况下,当看到超过 64 个线程时,会将它们分成处理器组。这可能就是您看到的线程数似乎较少的原因。虽然线程数少于您的预期,但它可能仅代表系统总线程数的一部分。
有一个同时多线程设置,默认情况下,在 Windows 10 中,此设置已打开。对于您的 64 核处理器,当同时启用多线程时,系统将显示 128 个线程,但这些线程分为两组。这种默认的 Windows 行为可能是阻止您查看(可见)所有线程的原因。关于您的具体要求我如何调整我的代码以使用所有 128 个线程,
...当程序在组内运行时,除非它是处理器组感知的,否则它只能访问同一组中的其他线程...
因此,答案是让您了解软件处理器组,或者通过禁用同时多线程进行设置以将所有内核放入单个处理器组,从而允许您的软件生成所有 128 个线程。
以下链接中更详细地介绍了这两种选择的方法和权衡...
在此处阅读详细信息...
64 核 Threadripper 3990x CPU 评测。
一些可能有助于使您的软件处理器组了解的链接:
摘自上一个链接的改编 C++代码(由于此问题已标记C,因此将其视为伪代码)
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
}
注意:在 MSDN 中搜索函数定义,例如:GetMaximumProcessorCount