programar practicar online letras lenguaje imprimir ejecutar dev convertir compila codigo c++ c performance optimization numerical

c++ - letras - practicar java online



¿Cómo escribir código rápido(bajo nivel)? (8)

Me gustaría obtener más información sobre la optimización de código de bajo nivel y cómo aprovechar la arquitectura de máquina subyacente. Estoy buscando buenos consejos sobre dónde leer sobre este tema.

Más detalles:

Estoy interesado en la optimización en el contexto de la informática científica (que es una gran cantidad de números, pero no solo ) en lenguajes de bajo nivel como C / C ++. Estoy particularmente interesado en los métodos de optimización que no son obvios a menos que uno tenga una buena comprensión de cómo funciona la máquina (que aún no lo hago).

Por ejemplo, está claro que un algoritmo mejor es más rápido, sin saber nada sobre la máquina en la que se ejecuta. No es del todo obvio que importa si uno primero pasa por las columnas o las filas de una matriz. (Es mejor recorrer la matriz para que los elementos almacenados en ubicaciones adyacentes se lean sucesivamente).

El asesoramiento básico sobre el tema o consejos para los artículos son bienvenidos.

Respuestas

Recibí respuestas con muchos consejos geniales, mucho más de lo que alguna vez tendré tiempo para leer. Aquí hay una lista de todos ellos:

Necesitaré un poco de tiempo de descremado para decidir cuál usar (sin tiempo para todos).


Aprendí mucho del libro Inner Loops . Es antiguo ahora, en términos informáticos, pero está muy bien escrito y Rick Booth está tan entusiasmado con su tema que aún diría que vale la pena verlo para ver el tipo de mentalidad que necesita para hacer volar una CPU.


C y C ++ suelen ser los idiomas que se utilizan para esto debido a su velocidad (ignorando Fortran ya que no lo mencionaste). Lo que puede aprovechar (que el compilador icc hace mucho) es el conjunto de instrucciones SSE para un gran número de cruces de números en coma flotante. Otra cosa que es posible es el uso de CUDA y Stream API para Nvidia / Ati, respectivamente, para realizar operaciones de coma flotante MUY rápidas en la tarjeta gráfica, dejando la CPU libre para hacer el resto del trabajo.



Otro enfoque para esto es la comparación práctica. Puedes obtener una biblioteca como Blitz ++ (http://www.oonumerics.org/blitz/) que, según me han dicho, implementa optimizaciones agresivas para computación numérica / científica, luego escribe algunos programas sencillos que realizan operaciones de tu interés ( por ejemplo, multiplicaciones de matrices). A medida que usa Blitz ++ para realizarlos, escriba su propia clase que haga lo mismo, y si Blitz ++ resulta más rápido, comience a investigar su implementación hasta que sepa por qué. (¡Si el suyo es significativamente más rápido, puede decirle a los desarrolladores de Blitz ++!)

Deberías terminar aprendiendo sobre muchas cosas, por ejemplo:

  • patrones de acceso a la memoria caché
  • plantillas de expresión (hay algunos enlaces malos encima de las plantillas de reexpresión de resultados de búsqueda de Google; el escenario / propiedad clave del que desea conversar es que pueden codificar muchos pasos sucesivos en una cadena de operaciones para que todos se apliquen durante un ciclo) un conjunto de datos)
  • algunas instrucciones específicas de CPU (aunque no he comprobado que hayan usado técnicas no portátiles) ...


Un libro interesante sobre manipulación de bits y formas inteligentes de hacer cosas de bajo nivel es Hacker''s Delight .

Esto definitivamente vale la pena leer para todos los interesados ​​en la codificación de bajo nivel.



Han pasado algunos años desde que lo leí, pero Write Great Code, Volume 2: Thinking Low-Level, Writing High-Level de Randall Hyde fue bastante bueno. Proporciona buenos ejemplos de cómo el código C / C ++ se traduce en ensamblaje, por ejemplo, lo que realmente ocurre cuando se tiene una declaración de switch grande.

Además, altdevblogaday.com se centra en el desarrollo de juegos, pero los artículos de programación pueden darte algunas ideas.