Skip to Content

Vectorización en C++

Los pragmas  dan información adicional al compilador. A veces se ven las siguientes líneas al comienzo de un programa.

#pragma GCC optimize("Ofast") #pragma GCC target("avx2")

Acerca de

Recursos
FuenteRecursoNotas
CFGCC Optimization Pragmas
GCC3.11 - Optimization Options
KACTL10.5.2 - Pragmas
CFWhat do SSE/AVX do?
CFSpeeding Up for Naive Algorithm
CodinGameSSE & AVX Vectorization

algunos bugs :(, parece estar bien en su mayor parte?

Según KACTL:

  • #pragma GCC optimize ("Ofast") hace que GCC autovectorice bucles y optimice mejor los puntos flotantes (asume asociatividad y apaga los denormales ).
  • #pragma GCC target ("avx,avx2") puede duplicar el rendimiento del código vectorizado, pero provoca crashes en máquinas viejas.

Según CodinGame,

Las CPU modernas pueden ejecutar hasta cuatro instrucciones al mismo tiempo si son independientes.

También se pueden consultar los artículos de Wikipedia sobre SSE  y AVX  (AVX es la versión más avanzada).

Ejemplos de CF

¡El ocasional Div 1 E queda trivializado por esto!

¿Dónde se pueden usar?

Que estos pragmas estén soportados depende de la arquitectura de la computadora (ver aquí ).

  • Ofast con avx2 funciona en CF y DMOJ.
  • sse4 y avx provocan errores de ejecución en InfoArena y Szkopuł . Sin embargo, #pragma GCC optimize("unroll-loops") parece funcionar en InfoArena (comparar TLE  y AC ).
  • En ocasiones han funcionado en problemas pasados de USACO, como la solución no intencionada de tiempo cuadrático al final de este problema .

¿Por qué no deberían usarse?

De este comentario :

To everyone who doesn’t know what’s going on here: seems that topicstarter doesn’t know it either, and it looks like some magic for him.

No es una buena idea incluir estos pragmas al comienzo de todos los programas. Como se mencionó arriba, estos pragmas provocan RE en algunos sitios. Otras veces el compilador los ignora, o peor aún, pueden hacer que el código sea más lento en lugar de más rápido (por ejemplo, ver aquí ).

Problemas

HechoFuenteNombreDificultadTagsSolución
KattisLigaturesDifícilSolución