システム内の論理コアの数に基づいて、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 を返します。これは明らかに関数が成功したことを意味します。