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 starting with Windows 10 Build 20348によると、API に変更 (およびいくつかの推奨される回避策) がありましたが、提供されている例ではカーネル呼び出しが使用されており、現在何を使用して情報を取得できるかが不明です。必要。

注: ドキュメントには、関数が 0 を返す場合はエラーがあり、エラーGetLastError(...)を特定するために使用することも記載されています。ただしGetLastError(...)、0 を返します。これは明らかに関数が成功したことを意味します。

4

0 に答える 0