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.

¿Alguien conoce una solución para un error/molestia del compilador MSVC donde la configuración de las Extensiones SIMD queda “atascada” en AVX?

¿Alguien sabe cómo solucionar un error/molestia del compilador MSVC donde la configuración de las extensiones SIMD queda “atascada” en AVX?

El contexto de esta pregunta es programar despachadores de CPU SIMD, siguiendo de cerca el conocido proyecto dispatch_example2.cpp de Agner. He estado probando con tres proyectos diferentes de MSVC y en dos de ellos me he topado con este problema, después del cual uno de esos dos proyectos se “arregló solo” de alguna manera.

La pregunta es bastante simple: para compilar los despachadores, necesito compilar 4 veces con los siguientes parámetros:

/arch:AVX512 /DINSTRSET=10
/arch:AVX2 /DINSTRSET=8
/arch:AVX /DINSTRSET=7
/arch:SSE2 /D__SSE4_2__

Mientras hago esto, observo el valor de INSTRSET y este código:

#if defined ( AVX512VL ) && defined ( AVX512BW ) && defined ( AVX512DQ )
#define AVX512_FLAG 1
#else
#define AVX512_FLAG 2
#endif

#if defined ( AVX2 )
#define AVX2_FLAG 1
#else
#define AVX2_FLAG 2
#endif

#if defined ( AVX )
#define AVX_FLAG 1
#else
#define AVX_FLAG 2
#endif

El comportamiento es así: para las tres compilaciones AVX, todo se comporta como se espera. Cuando no ocurre el problema, la compilación SSE2 muestra lo esperado (AVX512_FLAG, AVX2_FLAG, AVX_FLAG == 2) y el código final se ejecuta correctamente.

Cuando ocurre el problema, para la compilación /arch:SSE2 /D__SSE4_2__, el código anterior muestra AVX512_FLAG == 2 pero AVX2_FLAG == AVX_FLAG == 1 y INSTRSET == 8, y el compilador cree que las instrucciones AVX2 están habilitadas, lo que provoca que el proyecto se compile pero se bloquee en una máquina con SSE4.2.

Si intento /arch:SSE2 /DINSTRSET=6, obtengo INSTRSET == 6 en la compilación, pero el código anterior sigue mostrando AVX2_FLAG == 1 y AVX_FLAG == 1, y el proyecto final todavía se bloquea en una máquina con SSE4.2.

Los bloqueos ocurren incluso si no ejecuto ningún código vectorial, cualquier cosa que llame al despachador se bloquea de inmediato aunque todo el código vectorial esté deshabilitado.

Por cierto, intentar /DINSTRSET=6 es solo un acto de desesperación, nunca he logrado que nada funcione con SSE4.2 sin usar /D__SSE4_2__.

¿Alguien sabe cómo solucionar este problema que está deteniendo por completo mi progreso? Ya intenté hacer “Limpiar solución”.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Lamentablemente, no está claro a partir de la información proporcionada qué es exactamente lo que está causando el problema de que los ajustes de AVX se bloqueen. Podría ser un error en el compilador MSVC, o podría ser un problema con el propio código. Algunas sugerencias para intentar resolver el problema incluyen:

    • Verificar si existen configuraciones o indicadores del compilador que podrían interferir con los ajustes de AVX.
    • Asegurarse de que se esté utilizando la última versión del compilador.
    • Verificar si existen actualizaciones o parches para la versión específica del compilador que se está utilizando.
    • Intentar simplificar el código que se está compilando y verificar si el problema persiste.
    • Buscar ayuda de otros expertos en la comunidad o en foros que puedan haber encontrado problemas similares y encontrado una solución.

Comments are closed.