¿Hay algún estudio o conjunto de pruebas que demuestren la degradación del rendimiento debido a la especificación de alias -fno-strict-aliasing en GCC (o equivalente en otros compiladores)?Impacto de rendimiento de -fno-strict-aliasing
Respuesta
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 alias 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 pueden romperse sin cuidado código escrito. El GCC de Apple desactiva el aliasing estricto de forma predeterminada por este motivo.
LLVM, por el contrario, lo hace ni siquiera tienen estricta aliasing, y, si bien se prevé, los desarrolladores han dicho que planean implementarlo como un caso de repliegue cuando nada más se puede determinar 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 se puede utilizar para demostrar que las cargas in-loop no pueden aliar la matriz iterada, lo que les permite ser sacado del circuito. YMMV.
El enfoque de LLVM me parece el correcto – Spudd86
Lo que puedo decirte por experiencia (habiendo 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 locales (en cuanto al alcance) y pequeñas. En un ejecutable de 20MB raspaba quizá 80kb de la sección .text (= código) y todo esto en pequeños ámbitos & loops.
Esta opción puede hacer que su código generado sea un poco más liviano 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.
Porque el tamaño del código == velocidad? Tu ejemplo de PS3 no está aquí ni allá. ¿Cómo FUNCIONó? – Eloff
¿Dónde digo que es más rápido? Podría ser - no es impensable dado que las cargas/tiendas potenciales se han omitido - y en cualquier caso, es preferible un ejecutable más pequeño en una máquina con memoria encuadernada. Así que está aquí, y también está allí. – nielsj
El OP pidió implicaciones de rendimiento y usted solo habló sobre el tamaño del código. Luego utilizó un argumento ipso facto sobre por qué no verá una gran diferencia de rendimiento. Luego llamaste al kernel de Linux una "situación subóptima en el mejor de los casos". Creo que puedes ver por qué obtuviste el voto a favor. – Eloff
Aquí hay un enlace al estudio realizado en 2004: http://docs.lib.purdue.edu/cgi/viewcontent.cgi?article=1124&context=ecetr relacionado, entre otros, con un impacto de aliasing estricto en el rendimiento del código. La Figura 2.5 muestra una mejora relativa del 3% al 10%. explicación
Investigadores de la degradación del rendimiento:
de inspeccionar el código ensamblador, se encontró que la degradación es un efecto de el algoritmo de asignación de registros. 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. Código de derrame minimización a través del derrame de la región de interferencia. En SIGPLAN Conference on Programming Language Design and Implementation, páginas 287-295, 1997.
[3] Preston Briggs, Keith D. Cooper y Linda Torczon. Mejoras en la coloración de gráficos asignación de registros. Transacciones de ACM en Lenguajes y Sistemas de Programación, 16 (3): 428-455, mayo de 1994.
¿Conoces algún estudio que haya analizado el valor de las optimizaciones que estaría permitido por el estricto aliasing * que no podría lograrse también mediante el calificador 'restrict' *? – supercat
No conozco ninguna, ¿conoces alguna optimización que satisfaga estos requisitos? – SzymonPajzert
El calificador 'restrict 'no se puede usar de manera efectiva para decirle a un compilador que los objetos de duración estática no alias, y en algunos casos los programas pueden tener varios apuntadores posiblemente relacionados al mismo tipo que podrían alias entre sí. El alias basado en tipos permitiría algunas optimizaciones en aquellos casos que de otro modo no estarían disponibles. En mi humilde opinión, tales casos podrían haberse manejado mejor agregando mejores calificadores (por ejemplo, permitir un calificador de 'registro' en los casos en que un objeto puede estar expuesto a un código externo, pero que podría comportarse como si obtuvieran una nueva dirección cuando se accede a través de un puntero) – supercat
- 1. ¿Minimiza el rendimiento de impacto de Node.js?
- 2. Impacto del rendimiento de los métodos virtuales
- 3. Impacto del rendimiento de la herencia virtual
- 4. Log.d e impacto en el rendimiento
- 5. Impacto en el rendimiento de copiar variables de php
- 6. ¿Impacto de hyperthreading en el rendimiento del compilador?
- 7. Tamaño grande de Permgen + impacto en el rendimiento
- 8. ¿Cuál es el impacto en el rendimiento de los Contadores de rendimiento
- 9. ¿Tiene ACL en Linux un impacto en el rendimiento?
- 10. UILabel layer cornerRadius tiene un impacto negativo en el rendimiento
- 11. palabra clave 'nueva' en getter> impacto en el rendimiento?
- 12. Marcadores vs. Puntos vectoriales - impacto en el rendimiento
- 13. Impacto en el rendimiento del cambio a interfaces genéricas
- 14. ¿Agregará la opción de engarce rdinámico al rendimiento de impacto de gcc/g ++?
- 15. C++: impacto en el rendimiento de las clases GRANDES (con un montón de código)
- 16. ¿Hay algún impacto en el rendimiento en el uso de Live en lugar de vincular jQuery?
- 17. Impacto del diseño de WPF (Silverlight) Transformar en el rendimiento de la aplicación
- 18. Impacto en el rendimiento de la aplicación de LayoutTransform vs RenderTransform?
- 19. impacto en el rendimiento de la combinación "caliente" y "en línea" para una definición de función
- 20. ¿Cuánto impacto tiene el uso de 'var' en el rendimiento del compilador de C#?
- 21. Impacto de cientos de subprocesos inactivos
- 22. Bajo C# cuánto de un impacto en el rendimiento es un intento, lanzar y bloque catch
- 23. Impacto en el rendimiento del navegador de muchos archivos js incluye
- 24. ¿Tiene algún impacto en el rendimiento de Oracle al usar LIKE 'cadena' vs = 'cadena'?
- 25. ¿Por qué la reutilización de un DataContext tendría un impacto negativo en el rendimiento?
- 26. ¿Cuál es el impacto en el rendimiento de habilitar sesiones en Google App Engine?
- 27. impacto en el rendimiento de jvmti cuando el depurador no está conectado?
- 28. "impacto en el rendimiento" cuando se utiliza una línea de 20K clase única
- 29. Impacto de los identificadores de cuenta AWS
- 30. Reflejo de Java: impacto de setAccessible (verdadero)
Duplicado exacto: http://stackoverflow.com/questions/754929/strict-aliasing – GManNickG
No encontré ningún número de rendimiento en esa discusión. Estoy buscando algunos resultados/datos de prueba. ¿Me he perdido algo? – Carlos
FWIW, tampoco hay números de rendimiento en la respuesta aceptada. – peterchen