es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿GetNumaHighestNodeNumber(…) devuelve cero en un 3990X en Windows 11?

Tengo un código que crea X número de hilos basado en el número de núcleos lógicos en mi sistema. Tengo un 3990X (128 núcleos lógicos).

En Windows 10, puedo hacer lo siguiente:

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

    return (int)highest_node_number + 1;
}

Y luego utilizo esto para asignar mis hilos:

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;
}

En Windows 10, esto funciona perfectamente, con GetNumaHighestNodeNumber(...) devolviendo 1, pero en Windows 11, devuelve 0.

Ahora, según Soporte NUMA: Comportamiento a partir de Windows 10 Build 20348, ha habido un cambio en la API (y algunas soluciones alternativas sugeridas), pero los ejemplos proporcionados utilizan llamadas al kernel, y no está claro qué puedo usar ahora para obtener la información que necesito.

Nota: La documentación también dice que si la función devuelve un 0, entonces hay un error, y se debe utilizar GetLastError(...) para determinar el error. Sin embargo, GetLastError(...) devuelve un 0, lo que aparentemente significa que la función se ejecutó correctamente.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Windows-10 y NUMA

    En Windows 10, el código proporcionado en la pregunta funciona perfectamente para asignar hilos basados en el número de núcleos lógicos en el sistema. Utiliza la función GetNumaHighestNodeNumber(...) para determinar el nodo NUMA más alto disponible y luego utiliza system_cpu_num_numa_node_processors(...) para contar el número de procesadores en cada nodo.

    Windows-11 y NUMA

    Sin embargo, en Windows 11, la función GetNumaHighestNodeNumber(...) devuelve 0, lo que indica un error. De acuerdo con la documentación de Soporte de NUMA de Microsoft (NUMA Support), ha habido cambios en el soporte de NUMA en Windows 10 Build 20348 y versiones posteriores. La documentación proporciona algunas soluciones alternativas sugeridas utilizando llamadas al kernel, pero no está claro qué API se puede utilizar para obtener la información requerida.

    Además, la documentación menciona que si GetNumaHighestNodeNumber(...) devuelve 0, se ha producido un error y se debe usar GetLastError(...) para determinar el error. Sin embargo, en el código proporcionado, GetLastError(...) también devuelve 0, lo que significa que la función se ejecutó correctamente.

    Por lo tanto, aún no está claro qué API se puede utilizar en Windows 11 para asignar hilos basados en el número de núcleos lógicos en el sistema, y se necesita una investigación adicional para encontrar una solución.

Comments are closed.