c++ - pinecone - Repercusión en el rendimiento de-fno-strict-aliasing
make a programming language in java (3)
Lo que puedo decirte por experiencia (haber probado esto con un gran proyecto en PS3, PowerPC es una arquitectura que debido a sus muchos registros realmente puede beneficiarse de SA) es que las optimizaciones que vas a ver generalmente van a ser muy local (alcance) y pequeño. En un ejecutable de 20MB raspó quizás 80kb de la sección .text (= código) y todo esto fue en pequeños alcances y bucles.
Esta opción puede hacer que su código generado sea un poco más ligero y optimizado de lo que es ahora (piense en el rango del 1 al 5 por ciento), pero no espere grandes resultados. Por lo tanto, el efecto de usar -fno-strict-aliasing probablemente no va a ser una gran influencia en su rendimiento, en absoluto. Dicho esto, tener un código que requiera -fno-strict-aliasing es una situación subóptima en el mejor de los casos.
¿Hay algún estudio o conjunto de puntos de referencia que demuestren la degradación del rendimiento debido a la especificación de alias -fno-strict-aliasing en GCC (o equivalente en otros compiladores)?
Va a variar mucho de compilador a compilador, ya que los diferentes compiladores lo implementan con diferentes niveles de agresión. GCC es bastante agresivo al respecto: habilitar un aliasing estricto hará que piense que los punteros que son "obviamente" equivalentes a un humano (como en, foo* a; bar * b; b = (foo*)a;
) no pueden alias, lo que permite algunas transformaciones muy agresivas, pero obviamente puede romper un código no cuidadosamente escrito. El GCC de Apple desactiva el aliasing estricto de forma predeterminada por este motivo.
LLVM, por el contrario, ni siquiera tiene un alias estricto y, mientras está planeado, los desarrolladores han dicho que planean implementarlo como un caso alternativo cuando nada más puede juzgar la equivalencia. En el ejemplo anterior, todavía juzgaría ayb equivalentes. Solo usaría un alias basado en tipos si no pudiera determinar su relación de ninguna otra manera.
En mi experiencia, el impacto en el rendimiento del aliasing estricto tiene que ver principalmente con el movimiento de código invariante de bucle, donde la información de tipo puede usarse para probar que las cargas en bucle no pueden aliar la matriz que se itera, lo que les permite retirarse el lazo. YMMV.
Aquí hay un enlace al estudio realizado en 2004: http://docs.lib.purdue.edu/cgi/viewcontent.cgi?article=1124&context=ecetr , que se refiere, entre otros, al impacto estricto de alias sobre el rendimiento del código. La Figura 2.5 muestra una mejora relativa del 3% al 10%.
La explicación de los investigadores sobre la degradación del rendimiento:
Desde la inspección del código de ensamblaje, encontramos que la degradación es un efecto del algoritmo de asignación de registro. GCC implementa un asignador de registro colorante de gráficos [2, 3]. Con aliasing estricto, los rangos activos de las variables se vuelven más largos, dando lugar a una alta presión de registro y ''derrame''. Con aliasing más conservadores, las mismas variables incurren en transferencias de memoria al final de sus rangos de vida (más cortos) también.
[2] Peter Bergner, Peter Dahl, David Engebretsen y Matthew T. O''Keefe. La minimización del código de derrame a través del derrame de la región de interferencia. En la Conferencia SIGPLAN sobre Diseño e Implementación del Lenguaje de Programación, páginas 287-295, 1997.
[3] Preston Briggs, Keith D. Cooper y Linda Torczon. Mejoras en la asignación gráfica del registro colorante. ACM Transactions on Programming Languages and Systems, 16 (3): 428-455, mayo de 1994.