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
| Fuente | Recurso | Notas |
|---|---|---|
| CF | GCC Optimization Pragmas | |
| GCC | 3.11 - Optimization Options | |
| KACTL | 10.5.2 - Pragmas | |
| CF | What do SSE/AVX do? | |
| CF | Speeding Up for Naive Algorithm | |
| CodinGame | SSE & 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!
- Nagini
- sin pragmas : TLE 30
O3: 3509msOfast: 3525msOfast,avx: 2339msOfast,avx2: 1544msOfast,sse4: 2479ms
- Welcome home, Chtholly
- solo
Ofast: TLE avx: 2354msavx2: 1684mssse4: 2183ms
- solo
- Awesome Substrings
sse4/avx: TLEavx2: 6894ms
¿Dónde se pueden usar?
Que estos pragmas estén soportados depende de la arquitectura de la computadora (ver aquí ).
Ofastconavx2funciona en CF y DMOJ.sse4yavxprovocan 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í ).