1

我有一些代码可以根据系统中的逻辑核心数启动 X 个线程。我有一个 3990X(128 个逻辑核心)。

在 Windows 10 上,我可以这样做:

int numaAPI_GetNumNodes(void) 
{
    ULONG highest_node_number;
    if (!GetNumaHighestNodeNumber(&highest_node_number)) 
    {
        return 0;
    }

    return (int)highest_node_number + 1;
}

然后用它来分配我的线程:

int system_cpu_thread_count()
{
    const int num_nodes = numaAPI_GetNumNodes();
    int num_threads = 0;
    for (int node = 0; node < num_nodes; ++node) 
    {
        if (!system_cpu_is_numa_node_available(node)) 
        {
            continue;
        }

        num_threads += system_cpu_num_numa_node_processors(node);
    }

    return num_threads;
}

在 Windows 10 上,这完美地工作,GetNumaHighestNodeNumber(...)返回 1,但在 Windows 11 上,它返回 0。

现在,根据NUMA Support: Behavior started with Windows 10 Build 20348,API 发生了变化(以及一些建议的解决方法),但提供的示例使用内核调用,目前尚不清楚我现在可以使用什么来获取我的信息需要。

注意:文档还说,如果函数返回 0 则存在错误,并用于GetLastError(...)确定错误。但是GetLastError(...)返回一个 0,这显然意味着函数成功。

4

0 回答 0