2010-07-22 30 views
5

¿Cómo puede ayudar la programación en ensamblaje para lograr la optimizaciónlenguaje ensamblador y optimización

+3

No mucho, para ser sincero. –

+6

La historia de Mel: http://www.pbm.com/~lindahl/mel.html – Jay

+4

@Cheery: Tampoco entiendo cómo casi cualquier respuesta respondería esa pregunta. El OP necesita explicar lo que él quiere mejor. No sé qué significa "optimizar mi código" aquí, aunque puedo hacer conjeturas. Además, la respuesta a cualquier pregunta razonable dependería de la plataforma, el tipo de aplicación y el ensamblaje, en lugar de qué. –

Respuesta

7

Actualmente, tiene que ser muy bueno en el ensamblaje para vencer al compilador.

Puedo hacerlo cualquier día de la semana, pero solo viendo primero la salida del compilador.

Y luego, si gana más de un par de puntos porcentuales, me sorprendería.

En estos días, solo programo en ensamblado cuando estoy haciendo algo que el compilador no puede hacer.

1

Normalmente no se programa en el montaje. Debería programar en C y luego ver el ensamblaje generado para ver qué optimizaciones (o no) el compilador de C realizó automáticamente. Ajustar su código C (para permitir una mejor vectorización, por ejemplo) permitirá al compilador reorganizar mejor el código, lo que le dará un ensamblaje optimizado

2

La programación en el ensamblaje no optimizará, en sí misma, su código. Lo principal del montaje es que le permite tener acceso de muy bajo nivel y elegir exactamente qué instrucciones ejecuta el procesador.

Dado que no tendrá algún compilador que genere el ensamblado para usted, puede realizar optimizaciones de código al escribir el programa usted mismo, si sabe cómo hacerlo.

2

Entonces, ¿crees que eres más inteligente que el compilador de optimización gcc? Si no, entonces se regodeó en aboud it (aprendiendo asamblea por el bien de mejorar en la optimización). Eso sería similar a aprender el lenguaje Scheme en aras de conseguir mejor en la recursividad :)

+0

No estoy de acuerdo con la analogía. El esquema le obliga a tratar la recursión (si está utilizando expresiones idiomáticas estándar), pero el ensamblaje no lo obliga a optimizar. Al mismo tiempo, estoy de acuerdo en que la elección del ensamblaje para aprender a optimizar es bastante arbitraria. –

+0

@Justin K - ok. Aunque ... uno todavía puede abusar de la recursión en Scheme de una manera que hará que los programadores principiantes piensen que es la peor invención desde el pan no rebanado.No me crean, simplemente pídales a los usuarios SO (por ejemplo) que escriban la función más oscura que calcula factorial usando la recursión. –

14

La programación de forma más probable en el montaje puede mejorar su código es mediante la mejora de que: se enseña más sobre lo que está ocurriendo a un bajo nivel y obtener la disciplina de optimización puede ayudarlo a tomar buenas decisiones en idiomas de nivel superior.

En cuanto a ayudar a un programa: como otros han notado, rara vez vale la pena. Es posible que pueda usarlo como un tipo de optimización avanzada impulsada por el perfil: pruebe muchas variaciones hasta que encuentre la que mejor se adapte a su problema en particular.

Para comenzar con esto: escriba un programa en C o C++ o el lenguaje compilado que use normalmente, inicie su depurador y desmonte una función pequeña pero no trivial, y piense por qué el compilador hizo lo que hizo. Luego intente escribir un pequeño fragmento de ensamblador en línea usted mismo. En los sistemas modernos, el ensamblaje se puede incrustar fácilmente en C en lugar de hacerlo desde cero.

O, alternativamente, conseguir una máquina pequeñito como un PIC y que parpadee un LED ...

+1

Esto es correcto. Comprender cómo el compilador apunta a la arquitectura es casi inútil en términos de tratar de superar al compilador. Pero comprender lo que sucede en la asamblea y por qué tipo de cambio su forma de pensar sobre el código de modo que no se trata solo de la propia HLL, sino que está más dirigida a su plataforma. – Chris

+1

Exactamente. Creo que Alan Perlis estaba jugando con su cita: "los programadores de LISP conocen el valor de todo y el costo de nada". - No importa qué tan alto nivel tenga tu idioma, al final todo se reduce a las instrucciones de la CPU. Para hacer un ejemplo exagerado: si no sabes nada sobre la arquitectura de von Neuman, nunca entenderás que la lectura de un archivo será mucho más lenta que guardar cosas en la memoria. El mismo patrón en muchos otros casos. Al final del día, los lenguajes de alto nivel tienen los mismos aspectos de rendimiento que el ensamblaje. – delnan

0

Lo más probable es que ser capaz de superar el compilador en la escritura de código ensamblador. Saber cómo se traducen las tareas típicas al ensamblaje puede ayudarlo a escribir un mejor código de idioma de alto nivel.

Por lo general, no recurre al montaje para fines de optimización. Si esto es posible, normalmente alguien ya habrá proporcionado el código esencial listo para que usted llame, por ejemplo en forma de una biblioteca de álgebra lineal.

Del mismo modo, el montaje ofrece acceso directo al procesador (p.para atomicidad, medición de tiempo, E/S), pero los accesos importantes ya se habrán hecho accesibles para su lenguaje de alto nivel.

1

Solía ​​haber un muy buen libro sobre este tema, llamado Inner Loops by Rick Booth. Sigo pensando que es un libro muy valioso, ya que puede aumentar su conocimiento sobre qué buscar al optimizar el código de ensamblador (categorización de instrucciones como muy rápido, rápido, lento; cuando dos instrucciones se pueden ejecutar en paralelo; alineación de memoria, memoria caché) fallas, paradas, penalizaciones, etc.) Sin embargo, el libro solo cubrió los procesadores Intel hasta el Pentium Pro/Pentium MMX, y con las arquitecturas de hardware más nuevas que están disponibles en la actualidad, el libro ahora está bastante desactualizado.

Esto es exactamente el problema de optimizar el lenguaje ensamblador: Necesita conocer muy bien la arquitectura a la que se dirige; contraste esto con un compilador de optimización (por ejemplo, para el lenguaje C) que puede apuntar a diferentes plataformas y aplicará las optimizaciones en consecuencia. Se ha avanzado mucho en el conocimiento y el trabajo en la etapa de optimización de los compiladores, y tendrás que estudiar bastante una arquitectura en particular antes de que puedas vencer a un buen compilador.

+1

Quizás este sea el punto: se podrían escribir compiladores mucho mejores ... aunque no en ensamblaje –

5

En principio, puede escribir código altamente optimizado en ensamblaje porque el compilador está limitado a optimizaciones específicas de uso general que deberían aplicarse a muchos programas, mientras que puede ser creativo y utilizar sus conocimientos de este programa en particular.

Para tomar un ejemplo simple, cuando era nuevo en este negocio, los compiladores tenían una capacidad muy limitada para optimizar el uso del registro. Usted sabe que para realizar cualquier tipo de operación aritmética o lógica, la CPU generalmente debe cargar uno de los valores en un registro, luego realizar la operación en el otro y luego guardar el resultado. Me gusta agregar dos números juntos, y usaré un pseudo ensamblador aquí porque no sé qué lenguajes de ensamblaje conoces y he olvidado la mayoría de los detalles yo mismo, escribirías algo como esto:

LOAD A,value1 
ADD A,value2 
STORE a,destination 

Compiladores utilizados para generar las cargas para cada operación. Así que si su programa en C dijo:

x=x+y; 
z=z+x; 

El compilador generaría algo como:

LOAD A,x 
ADD A,y 
STORE A,x 
LOAD A,z 
ADD A,x 
STORE A,z 

Pero un ser humano pudo observar que en el momento de llegar a la segunda declaración, regístrese A ya contiene x, y la suma es conmutativa, por lo que podríamos optimizar esto para:

LOAD A,x 
ADD A,y 
STORE A,x 
ADD A,z 
STORE A,z 

Etcétera. Uno podría atravesar todo tipo de pequeñas micro optimizaciones como esta. Solía ​​hacer eso todo el tiempo cuando era joven y el mundo era verde.

Pero a lo largo de los años los compiladores se han vuelto mucho más inteligentes y las CPU se han vuelto más potentes, por lo que las microoptimizaciones no importan tanto.

Por lo tanto, no he escrito ningún código de lenguaje ensamblador en, wow, probablemente 15 años. Solía ​​leer el ensamblado generado por el compilador cuando se depuraba, a veces daba una pista para un problema sutil, pero tampoco lo he hecho en años.

No creo que los compiladores estén escritos en ensamblaje. En su lugar, escribe el primer borrador del compilador en un lenguaje de alto nivel en otra computadora, es decir, usted escribe un compilador cruzado para despegar.

Sospecho que el único uso real del ensamble hoy es para entornos extremadamente restringidos, sistemas integrados y ese tipo de cosas; y para programas que tienen que lidiar íntimamente con el hardware, como los controladores de dispositivo.

Me interesaría saber si hay programadores de montaje en este foro que quieran decirnos por qué programadores de ensamblado.

+1

Ah, pero déjenme agregar: creo que es muy valioso aprender a ensamblar para que comprendan cómo funciona realmente la computadora dentro. Incluso si nunca escribe montaje para un proyecto real, saber cómo funciona es muy valioso. He visto muchos programas donde el programador hacía cosas que eran muy ineficientes o sujetas a errores sutiles, y es bastante obvio que la fuente del problema es que el programador no entiende lo que realmente está sucediendo dentro de la caja. – Jay

0

Los compiladores hacen un buen trabajo generando ensamblador.

Sin embargo, hay un malo por lo que el ensamblador escrito a mano es más rápido. Como es más difícil escribir, escribes menos.

Sería bueno si los programadores pudieran disciplinarse para hacer el mismo trabajo con un código mínimo, independientemente del idioma.

+0

Es por eso que me gusta Python: alienta un código mínimo, incluso al punto de incluir baterías para todo tipo de construcciones. –

0

Al escribir el ensamblaje, o incluso simplemente los bytes crudos directos de las salidas del ensamblador, puede escribir programas que utilizan características específicas del hardware de la computadora o hace algo muy cuidadosamente especificado.

Puede haber beneficios realmente grandes si su programa hace la parte optimizada con mucha más frecuencia que con cualquier otra cosa. Configure siempre puntos de referencia antes de intentar optimizaciones.

El inconveniente es que su ensamblaje escrito a mano funciona con menos hardware diferente. ¡Incluso puede terminar siendo limitado en el modelo de hardware y la revisión!

Es raro que pueda o necesite escribir rutinas de ensamblaje porque el software comúnmente escrito debe funcionar en casi todos los dispositivos que encuentre y su gatito.

Hay una aplicación interesante si conoce el ensamblaje. Luego puede escribir programas que producen rutinas de ensamblaje. Aunque en su mayoría solo es divertido a menos que lo mantengas realmente pequeño para que puedas portarlo fácilmente.

2

Acerca de la única vez que puedo pensar en usar el lenguaje ensamblador para la optimización de código es cuando se necesita algo muy específico, que necesita un GPIO en un microcontrolador para alternar entre alta y baja exactamente cada 9 ciclos de reloj. ese es un tiempo demasiado corto para administrarlo con una interrupción, y los compiladores de lenguaje de nivel superior normalmente no ofrecen este tipo de control sobre la secuencia de instrucciones.

1

En general, el compilador hará un trabajo bastante bueno generando código óptimo. Sin embargo, hay casos en los que escribir su propio ensamblaje puede resultar en un código aún más optimizado (en términos de espacio y/o velocidad).

Normalmente, esto sucede cuando hay algo que usted sabe sobre el sistema de destino que el compilador no sabe. Los compiladores están diseñados para trabajar en una variedad de sistemas; si desea aprovechar algo exclusivo de su sistema objetivo, a veces debe ingresar y hacerlo usted mismo. Aquí hay un ejemplo. Hace unos meses, estaba escribiendo un código para un sistema integrado basado en MIPS. Hay muchos tipos diferentes de CPU MIPS, y algunos admiten ciertos códigos de operación que otros no. Mi compilador generaría código MIPS utilizando el conjunto de operaciones de ensamblaje que soportan todas las arquitecturas MIPS. Sin embargo, sabía que mi chip podría hacer más. Tenía una subrutina que necesitaba contar el número de ceros a la izquierda en un número de 32 bits. El compilador sintetizó esto en un bucle que requirió aproximadamente 10 líneas de ensamblaje.Lo re-escribí en una línea usando el código de operación CLZ que fue diseñado para hacer esto. Sabía que mi chip soportaba el código de operación pero el compilador no. Es cierto que situaciones como esta no son muy comunes; cuando aparecen, sin embargo, es bueno tener suficientes antecedentes en el ensamblaje para aprovecharlos.

2

A veces será necesario realizar una tarea que se corresponda particularmente bien con algunas instrucciones de CPU, pero no se adapta bien a ninguna construcción de lenguaje de alto nivel. Por ejemplo, en muchos procesadores se puede realizar fácilmente la aritmética extendida precisión usando algo como:

 
    add r0,r4 
    addc r1,r5 
    addc r2,r6 
    addc r3,r7 

Este considerará a R3: R2: R1: R0 y R7: R6: R5: R4 como números de cuatro palabras, añadiendo el segundo al primero. Cuatro buenas instrucciones fáciles, cualquiera que entienda el ensamblaje sabrá lo que hacen. No conozco ninguna forma de realizar la misma tarea en C sin ella, no solo generando código objeto más grande y más lento, sino también un lío incomprensible de código fuente.

Un ejemplo algo más extremo pero especializado del mundo real: Dadas dos matrices array1 [0..63] y array2 [0..63], calcule array1 [0] * array2 [0] + array1 [1] * array2 [1] + array1 [2] * array2 [2] ... + array1 [63] * array2 [63]. En un DSP que utilicé, el cálculo podría hacerse en código de máquina en aproximadamente 75 ciclos de máquina (de los cuales aproximadamente 67 son una instrucción repetitiva de MAC). No hay forma de que el código C pueda acercarse.

0

En la mayoría de las aplicaciones modernas, no puede en un grado significativo.

Inter-Process Communication Affects Application Response Time explica por qué es poco probable que los algoritmos sean cuellos de botella. (Pero siempre perfil - nunca adivinar.)

En general, la programación en conjunto aumentará el tiempo de lanzamiento al mercado, la densidad de errores y los costos de mantenimiento. En su lugar, busque la simplicidad y la legibilidad en su código.

Como se mencionó en poolie, la principal ventaja de aprender ensamblaje hoy es una comprensión más profunda del software y hardware. Desde esa perspectiva, hay bastante información en Steve Gibson's site.

0

Si entendió por qué a veces hay la necesidad de hacer asm, apreciaría las fortalezas, los costos (dolores de cabeza para usted).

Cuestiones relacionadas