jacoboBien, bienvenidos a esta charla de UMEET
jacobohoy Alan Cox hablará de "Optimización para procesadores modernos"
jacobopara mantener este canal legible lo hemos puesto +m
jacobopara que sólo los ops puedan hablar
jacobosi teneis perguntar durante la charla, podeis preguntar en #qc
Ricardo(nota: los que quieran hacer preguntas, y no sepan inglés, háganlas directamente en #qc, que alguien las traducirá)
jacoboseguramente conozcais ya a Alan Cox, que es una de las principales fuerzas tras el desarrollo del núcleo de Linux
jacoboes un hombre de muchos talentos, sin embargo
jacobode hecho, incluso preparó transparencias para esta charla
jacobolas podeis encontrar en:
jacobohttp://www.linux.org.uk/~alan/Slides/
jacoboAlan, empieza cuando estés listo
jacobo<Alan> Vale
jacoboEsta charla es en parte acerca de cómo funcionan los procesadores modernos
jacoboEn su mayor parte, sin embargo, trata de por qué cambia la forma en que teneis que programar para obtener el mejor rendimiento
jacobopor procesadores modernos nos referimos a cualquier cosa del pentium en adelante - y de algunos modos del 486 en adelante
jacoboHace diez años un procesador de 40 MHz era bastante rápido. Hoy, la misma posición la ocupa un procesador de 3 GHz
jacoboLa memoria no ha aumentado de velocidad para equipararse a esto, y de modo más importante no ha mejorado en su latencia (el tiempo que pasa entre que se pide un trozo de memoria hasta que se obtiene) mucho
jacoboLos nuevos procesadores también pueden ejecutar varias instrucciones en cada ciclo del reloj, así que en realidad el procesador podría intentar acceder a la memoria no 100 veces más rápido como podríais pensar del cambio en la velocidad del reloj, sino unas 500 veces más rápido
jacoboPara tratar con esto los procesadores añadieron memoria caché. Es posible construir sistemas que sólo tienen memoria muy rápida, pero esto es increíblemente caro
jacoboEl tipo de ordenador que podeis encontraros en vuestra mesa hoy en día tiene un subsistema de memoria muy lento - cosas como SDRAM de 133MHz y ram DDR han mejorado la velocidad de los datos, pero no suficientemente, y han hecho poco por mejorar el tiempo de acceso para unos datos dados
jacoboPara daros una idea de lo lenta que es la memoria principal comparada con la caché medí la velocidad de copia de datos de la caché del procesador (llamada caché L1 o de nivel 1) y la caché más grande y más lenta (la caché L2 o de nivel 2)
jacoboEn un Athlon la caché L2 era 6 veces más lenta para copiar que la caché L1
jacoboLa memoria principal es 8 veces más lenta que la caché L2
jacoboAsí que por cada dato que tenéis que obtener de la memoria principal podríais obtener 50 de la caché
jacoboEsto hace que mantener las cosas correctas en la caché sea extremadamente importante, así como saber cómo funciona la caché para que entendáis lo que se necesita para hacer mejor uso de ella
jacoboEn términos del "mundo real", si vuestra caché L1 fuera vuestra mesa y llevara 1 segundo, acceder a la memoria principal (vuestro fichero, por ejemplo) llevaría 1 minuto por cada elemento que tuviérais que buscar
jacoboLo mismo es cierto en casi todos los procesadores modernos. Cuanto más reciente sea el procesador suele ser mayor el hueco porque el procesador es cada vez más rápido, de forma más veloz que la memoria
jacoboLo peor es que hay limitaciones físicas en la velocidad de la memoria, y en lo rápido que las señales pueden viajar por la placa base - la velocidad de la luz es demasiado lenta hoy en día
jacoboLa pregunta obvia entonces es qué hay en la caché. Si sabemos qué hay en la caché y qué datos almacenará tendremos alguna idea de cómo queremos escribir nuestros programas
jacobod33p] ¿la caché puede ser manipulada por un programador? yo creía que no...
jacobod33p: en los casos normales no puede controlarse directamente la caché, pero se puede entender cómo se comporta la caché
jacobod33p: hay instrucciones en los procesadores más recientes con las que puedes ayudar a la caché - pero esa es la última transparencia de la charla 8)
jacoboLa caché guarda los datos y código que se utilizaron más recientemente. Así que si ejecutas un bucle, éste terminará en la caché
jacobode modo similar, si sueles mirar en una lista, el contenido de la lista terminará en la caché
jacoboYa que la caché es bastante primitiva en varias formas, los datos reales que puede almacenar en cada segmento de la caché (cada línea de caché) están bastante restringidos
jacoboEl procesador no tiene tiempo de mirar en toda la caché para ver si un dato ya está en ella. En su lugar, divide la dirección en varios trozos
jacoboLos bits superiores de la dirección (dirección & ~4095) van al hardware de gestión de memoria para convertir una dirección virtual en una dirección física
jacoboAl mismo tiempo los bits inferires se pasan a la caché. La caché mira a los bits restantes (ignorando los 4-6 más bajos, dependiendo del procesador)
jacoboy mira en dos o cuatro lugares para ver si los datos que necesita están presentes. Si lo están entonces los utiliza, y cancela el trabajo que está haciendo el hardware de gestión de memoria.
jacoboEsta limitación tiene algunos efectos extraños que demostraré más tarde
jacoboNo toda la memoria entra en caché, por supusto - sería una mala idea si se metieran en caché datos dirigidos a la pantalla y no vierais el texto porque el procesador los tuviera
jacoboinit64] Alan_Q: otras cachés tienen otras formas de buscar líneas. Utilizan un "comparador" por línea de cache, pero supongo que es demasiado caro para cantidades grandes de caché
jacoboinit64: básicamente si - cuanto más complejo sea un algoritmo más tiempo llevará ejecutarlo - incluso en hardware
jacoboCon un procesador de 3 GHz no tienes mucho tiempo para decidir si algo está en caché o no
jacoboEse es también otro motivo por el que es común tener una caché L1 pequeña y rápida y una caché L2 más grande y lenta (pero más inteligente)
jacoboLos procesadores suelen tratar con la memoria en trozos de 16, 32 o 64 bytes
jacoboAsí que cada trozo de la caché guarda trozos de ese tamaño y alineados a ese tamaño. Los trozos son cada vez más grandes según las cachés L1 aumentan de tamaño, normalmente.
jacoboTodo eso se carga al mismo tiempo. Cuando le pides a un Athlon un byte de datos cargará los 64 bytes que quiere.
jacoboEsto significa varias cosas - una de ellas es que si vas a utilizar datos, pongas los datos que utilizas juntos
jacoboEl núcleo gasta mucho trabajo en poner las estructuras en un orden en el que los datos que se usan juntos estén juntos
jacoboporque si cargaras un bit de esos datos ya tendrías el resto, de todos modos
jacoboBien, ahora una demostración de por qué importa saber cosas sobre las cachés, es demo1 (http://www.linux.org.uk/~alan/Slides/slide5.html)
jacoboEs un programa muy simple que graba 4096 valores en la memoria
jacobo(lo ejecutamos muchas veces para obtener números)
jacoboLo ejecutamos con los datos separados en límites de 1, 2, 4, 8, 16, 32 y 64 bytes
jacoboigual que si se actualizara un array de estructuras de distintos tamaños
jacobotarzeau] ¿cómo se ejecuta demo1 en modo de simple-usuario?
jacobotarzeau: te dará respuestas razonablemente fiables si lo ejecutas sin muchas cosas ejecutándose al mismo tiempo
jacoboincluso en multiusuario
jacoboAsí que lo que hace demo1 es muy parecido a un gran número de aplicaciones completamente normales.
jacoboNotaréis que incluso en un Pentium IV con memoria muy buena y cachés grandes el rendimiento cae considerablemente
jacoboifvoid] ¿cómo de grandes son las cachés L1 y L2 del P4?
jacoboEsto varía dependiendo de si es un Xeon o no
jacoboEstos números proceden de un Xeon con 512K de caché L2 y creo que 64K de caché L1
jacoboSi ejecutas el programa en algo como un Celeron veréis una reducción de rendimiento mucho más rápida
jacoboseguro que también querréis cambiar el bucle for para que haga 100000 no 1000000 o estaréis esperando por él toda la noche
jacoboRealmente podéis utilizar técnicas como esta para hallar las propiedades de la caché de un procesador
jacoboNo lo hacemos en Linux porque el núcleo sabe cómo preguntarle correctamente al procesador los datos (y pone muchos de éstos en /proc/cpuinfo)
jacoboLo que esto nos dice es que si vas a pasar por grandes bloques de datos, queréis que los valores que leéis estén juntos en la memoria
jacoboSi hacemos 4096 comparaciones de valores cercanos podríamos ser muchas veces más rápidos que si miráramos en un campo de cada elemento del array
jacoboEsto demuestra lo importante que es una planificación cuidadosa.
jacoboPor supuesto, en muchos casos podéis utilizar árboles, hashes u otras estructuras de datos inteligentes para obtener los mismos o mejores resultados
jacoboLa segunda demostración está diseñada para mostrar otra cosa
jacoboEn procesadores antiguos era muy común utilizar tablas precalculadas para cosas como la división en juegos 3D. Con un procesador moderno esto no está siempre tan claro
jacoboDemo2 averigua lo que se tarda en hacer muchas divisiones, y luego lo compara con la utilización de una tabla precalculada para hacer lo mismo.
jacoboEn el pentium4 una vez que la tabla supera los 128K el rendimiento es mejor haciendo los cálculos - incluso cuando la división es una operación extremadamente costosa
jacoboEsto es porque buscar datos en memoria es realmente más carao que hacer divisiones
jacobo(lo mismo, en una máquina más lenta querréis hacer el bucle algo más pequeño)
jacobosmesjz] Paso de 1 por 4K llevó 50 segundos. (p133/2.5.49) :)
jacobosmesjz: Te da una idea de lo que cambió el rendimiento de los procesadores
jacoboEl de la división es bastante interesante porque depende mucho del procesador
jacoboen algo como un pentium la tabla será muchísimo más barata
jacobopero cuando llegas a los athlons y PIII/PIV se hace mucho menos claro
jacobosmesjz] Alan_Q: me sorprende que 5 de los tests de demo1 devuelvan 50 segundos de tiempo de ejecución (100k iteraciones)
jacobosmesjz: Para averiguar por qué, tendrías que mirar más profu8ndamente a lo que ocurre - yo tampoco lo sé, a menos que el verdadero límite sea tu memoria
jacoborp] ¿alguien me puede explicar el significado exacto de 1024 tablesize?
jacoborp: las diferentes ejecuciones acceden a datos de tablas precalculadas de 64K, 128K y así
jacoboasí que una tabla de 1024K significa que el programa simula acceso aleatorios a 1Mbyte de datos precalculados
jacobosi lo ejecutais con tamaños más y más grandes, al final el rendimiento se vuelve constante. Esto os da una idea de que la caché ya no ayuda
jacoboEste test en particular es muy importante para cosas como procesado de imágenes. Compresión jpeg y similares
jacobouno de los motivos por los que MMX es una ayuda en procesamiento de imágenes es que os permite hacer mucho procesamiento al mismo tiempo, así que se pueden evitar las tablas al hacer cosas como conversión de colores
jacoboridiculum] ¿hay en Linux alguna herramienta como Vtune (intel) para depurar cosas como explica alan?
jacoboridiculum: Hay dos - hay una cosa open source llamada "oprofile", y hay el vtune de Intel, que es caro y requiere un segundo PC windows y otras cosas
jacoboridiculum: puedes mirar muchas de las estadísticas porque los procesadores más recientes tienen registros de depuración
jacobopermiten que herramientas como oprofile le pregunten al procesador "¿cuántos fallos de caché?", "¿cuántas veces tuviste que esperar por los datos"?
jacoboy otras preguntas similares
jacobohttp://oprofile.sourceforge.net/ es el "profiler" OProfile
jacoboAsí que tenemos algunas demostraciones simples de lo importante que es la caché
jacoboavoozl] también podría ser interesante mirar valgrind, la última versión también puede hacer simulación de caché y mostrar en qué partes de un programa suceden fallos de caché
jacoboavooz: si, me había olvidado de que valgrind puede hacer simulación de caché
jacobo¿hubo cpus sin caché? ¿intels 80286?
jacobotarzeau: hubo muchas. El 286 casi nunca era más rápido que la RAM a la que estaba conectado - de igual modo en el Amiga la RAM es casi dos veces más rápida que el procesador
jacoboEl amiga, de hecho, utilizaba ese truco para darle al procesador y chips de apoyo acceso compartido
jacobodándole acceso alternativo al procesador y juego de chips
jacoboAsí que, ¿qué hemos aprendido sobre la caché y hacer buen uso de ella?
jacoboBien - sabemos que cuando recibimos datos los recibimos en trozos, así que podemos poner las cosas que usamos en el mismo lugar.
jacoboEsto ayuda al procesador y también, de paso, ayuda a la memoria virtual (cuando intercambias datos a disco se hace en trozos de 4K, así que también podríais mantener los datos juntos para ello, también)
jacoboHemos demostrado que queréis mantener vuestro procesamiento que quepa en la caché. Un motivo por el que Intel vende procesadores caros con cachés muy grandes es que las bases de datos encuentran gran dificultad en hacer esto
jacoboasí que los Xeons y los pentium-pro realmente caros con cachés de 1Mb eran buenas para trabajo con bases de datos
jacoboTambién sabemos que sólo se puede meter en caché una cierta cantidad de datos en una alineación dada
jacoboEl núcleo utiliza localizadores de memoria especiales para dispersar los objetos que utiliza el núcle en diferentes alineaciones específicamente debido a ello
jacobotarzeau] esos chips de memoria edo eran de 60ns y 70ns, de cuántos ns son las cachés l1 y l2?
jacobotarz: en los procesadores modernos no estoy seguro - incluso en el 486 la caché L2 era de unos 16nS
jacoboSi tenéis un array de objetos de tamaño que sea potencia de dos seguramente recibiréis casi el peor rendimiento posible de las cachés
jacoboasí que es un truco útil añadir un cierto espacio no utilizado en cada bloque de memoria para almohadillar los elementos del array para que entren mejor en caché
jacoboBien, es hora de la siguiente demostración
jacobohttp://www.linux.org.uk/~alan/Slides/slide7.html
jacobo(no hay demo3... la saqué para que la charla se ajustara mejor al tiempo 8))
jacoboEstá diseñada para mostrar cómo distintas formas de hacer algo pueden tener diferente rendimiento debido a las cachés
jacobolo que realmente hace (sumar números) es bastante trivial, pero no es distinta a ejemplos reales de programación
jacoboLa primera ejecución genera un conjunto grande de datos, y luego los suma. Generar conjuntos de datos y después procesarlos, y después procesar el resultado es una forma muy común de programar
jacobopero puede dar el peor rendimiento posible
jacoboEn la segunda ejecución sumamos los datos mientras lso generamos, y obtenemos mejor rendimiento
jacoboEsto es mayormente debido a que en la primera ejecución terminamos vaciando todos los datos de la caché y luego volviéndolos a cargar
jacoboEn el segundo caso ya que sumamos al vuelo, los datos sólo dejan la caché una vez
jacoboEl caso final muestran qué parte de la operación es la que realmente nos absorbe el tiempo
jacoboLo que esto significa es que para cualquier cantidad grande de datos y cálculos es importante trabajar  con ella en trozos
jacoboLos ingenieros y gente de computación de alto rendimiento lo hacen todo el tiempo - GIMP también sabe esto
jacoboMuchas cosas de las que hace GIMP en sus filtros las hace utilizando rectángulos de la imagen en lugar de aplicar cada cambio a la imagen completa, uno tras otro
jacobodebUgo-] Alan_Q: cuánto afecta la "asociatividad" de la caché en el rendimiento general de la memoria?
jacobodebUgo-: mantener los datos en la caché crea una gran diferencia en el rendimiento general - principalmente en sistemas SMP, que es adónde van las siguiente stransparencias
jacoboHay muchos algoritmos para esto y las mismas técnicas se utilizan en clusters y Beowulfs - sólo que tratan de minimizar el número de mensajes sobre ethernet, así que es mucho más importante que en un solo sistema
jacoboTodas estas cosas sobre cachés importan mucho más con un PC multiprocesador
jacoboMenos en las máquinas alpha y sparc más grandes porque tienen sistemas de memoria diseñados para varios procesadores
jacoboUn athlon dual o pentium III/IV dual está formado por dos procesadores en el mismo bus de memoria
jacoboLas tres demostraciones ya han mostrado que con un solo procesadore el rendimiento de la memoria no depende del procesador
jacobo(no llega al de un procesador, perdón)
jacoboAsí que una máquina con dos procesadores nos da el doble del mismo problema
jacoboUna de las demostraciones que podéis hacer es ejecutar una copia de memoria grande y continua en un procesador y medir el rendimiento de las copias en el otro - en algunas máquinas PC duales las copias que se miden se ejecutan a 1/3 de la velocidad a la que corren sin el otro bucle de copia
jacoboifvoid] Alan_Q: ¿esto no cambia en el Hammer e Itanium 3?
jacoboifvoid: hammer te permite conectar memoria a cada procesador, cuantos más procesadores añades más controladores de memoria puedes añadir
jacoboifvoid: depende del coste el si los vendedores lo harán
jacoborp] ¿esto significa que el rendimiento de la memoria no sólo depende del procesador sino también de la velocidad del bus?
jacoborp: yes
jacoborp: si
jacobounlevel0] <Alan> Así que una máquina de dos procesadores nos da el doble del problema: esto explica por qué no recibimos el doble del rendimiento de un procesador
jacoborunlevel0: hay dos motivos por los que no se obtiene el doble de rendimiento
jacoboel primero es que compartes memoria que no es suficientemente rápida
jacoboel segundo es que hay un coste en detener el sistema por hacer las dos cosas incorrectas al mismo tiempo
jacobo(impedir que haga dos cosas mal al mismo tiempo)
jacoboel núcleo tiene que hacer trabajo real para evitar que dos personas reserven la misma memoria, utilicen el mismo bloque de disco y otras cosas que no queremos que pasen
jacoboEl único motivo por el que se puede utilizar un PC de dos procesadores es que la mayoría de lso accesos a memoria vienen de la caché en una utilización normal
jacobocada procesador tiene su propia caché (salvo algunas máquinas de dos pentium, que sólo hacen daño 8))
jacoboridiculum] ¿y qué pasa con hyperthreading y coherencia caché?
jacoboridiculum: el hyperthreading comparte la caché entre las dos unidades de ejecución del procesador
jacoboasí que haces dos cosas a la vez pero cada aplicación sufrirá más fallos caché
jacobosh0nX] aquí es donde entran los spinlocks
jacobosh0nX: correcto - es la principal cosa que utiliza el núcleo para sincronizar las cosas internamente
jacoboUna cosa que tienen que hacer los procesadores es asegurar que ambos procesadores no meten distintas versiones de los mismos datos en caché, o pierdan cambios que hace el otro procesador
jacobodocelic] Me gustaría saber más sobre los spinlocks
jacobodoc: hablaremos de ello tras la charla principal
jacobobzzz] Alan_Q: ¿cómo pueden los dispositivos pci ver datos que están sólo en caché?
jacobobzzz: los procesaodres, además de asegurarse de que ven los cambios de los demás hacen lo mismo con los dispositivos del bus PCI
jacobobzzz: la técnica de "cacheado" estándar es una cosa llamada MESI
jacoboeso indica los cuatro estados en los que puede estar cada trozo del caché
jacobotenemos "M", o estado modificado. Significa que esa información es algo que el procesador ha cambiado y tenemos datos sobre los que no saben nada los otros procesadores
jacoboTenemos "E" - estado exclusivo - en el que sabemos que nadie más tiene estos datos pero nosotros sí
jacoboTenemos "S" o estado compartido (shared), en el que sabemos que tenemos una copia de los datos pero otros también tienen otra en estado compartido
jacoboy tenemos "I" o no válido (invalid) - en que no sabemos qué ocurre pero sabemos que no tneemos los datos
jacoboen cualquier momento dos procesadores no pueden tener los mismos datos salvo en estado compartido
jacobocuando modificamos datos cambiamos su estado - si es exclusivo se vuelve modificado
jacobosi era compartido tenemos que patear a los demás procesadores y hacer que se deshagan de sus copias
jacobosi no tenemos una copia (I) debemos pedirla - igual que moverse de compartido puede ser bastante caro
jacobosi otro procesador tenía una copia en estado modificado tenemos que pedirle que la grabe en memoria y luego leerla nosotros
jacobolo que queremos evitar a toda cosa es tener dos procesasdores que modifiquen continuamente los mismos datos
jacoboEsto se convierte en uan especie de pelea por comida en el bus de memoria
jacoboy pasamos la mayor parte del tiempo pasando datos entre procesadores
jacoboEsto no deja mucho tiempo para el trabajo de verdad -y cuando quieres pasar a ordenadores grandes se convierte en algo muy importante a evitar
jacoboIBM ha hecho mucho trabajo en el código del núcleo en el que este tipo de luchas pueden suceder, ya que tienen sistemas de 16 procesadores
jacobolo que deja muy claro cuando has hecho esto mal
jacobosh0nX] Alan_Q: deberíamos utilizar la caché en procesadores SMP para guardar datos que no van a cambiar mucho y utilizar éstos para manejar datos que cambian mucho?
jacoboshonx: hay sistemas en los que tiene sentido tener datos muy compartidos fuera de caché. La forma en que el hardware del PC funciona te impide hacerlo
jacoboIncluso si la sacas de caché es lenta
jacoboLa mayor parte del tiempo no es un problema - las aplicaciones no comparten muchas cosas, de todas formas
jacoboLas aplicaciones con hilos tienden a compartir muy pocos datos, gracias a Dios
jacoboCuando se diseñan aplicaciones con hilos y SMP es importante minimizar la cantidad de tiempo que pasan los datos botando entre procesadores
jacoboAsí, por ejemplo, si haces codificación JPEG en un sistema multiprocesador sería mejor utilizar un procesador para hacer la parte superior de la imagen y el segundo para hacer la parte inferior
jacoboque hacer que un procesador haga conversión de colores y el otro el paso de compresión
jacoboen cosas como codificación mpeg esto se vuelve complicado
jacoboAdemás es posible tener lo que se llama "falsa compartición"
jacoboh0nX] Alan_Q: así que queremos que ambos procesadores hagan cosas DISTINTAS
jacobosonx: exactamente
jacoboshonx: igual que la gente, los procesadores funcionan mejor cuando no se están pisando unos a otros
jacoboLa compartición falsa ocurre porque la caché del procesador trabaja en trozos de 32 o 64 bytes
HeimySi pones dos datos sin relación en los mismos 64 bytes puedes acabar accidentalmente teniendo que cada procesador use una cosa en la misma línea de caché (y estalle una pelea)
HeimyPor tanto la gente rellena tales estructuras para hacerlas mayores, y evitar esto
Heimyo las mantienen separadas
Heimy(rellenarlas con ceros - padding - evita compartirlas, pero implica usar más caché, por supuesto), de manera que estaremos haciendo lo que demo1 dice que no deberíamos
Heimysh0nX] Alan_Q: de manera que cuando diseñemos aplicaciones SMP, ¿cómo le decimos al procesador que gestione qué datos sin hacer que los procesadores trabajen con los mismos datos?
Heimyshonx: el planificador intenta mantener un mismo thread ejecutándose en el mismo procesador siempre que sea posible
Heimyde manera que es simplemente cosa de evitar acceder mucho a los mismos datos desde dos threads diferentes
HeimyDe forma similar, intentamos mantener una aplicación dada ejecutándose en el mismo procesador de manera que no tengamos que perder un montón de tiempo copiando cosas de un procesador al otro
Heimy[14-Dec:19:25 yalu] Alan_Q: ¿Es el planificador suficientemente inteligente como para mantener hilos que comparten un montón de datos en el mismo procesador?
Heimyyalu: intenta imaginarse un par de cosas sencillas
Heimypero en realidad es muy difícil medir de forma eficiente la cantidad real de datos compartidos
Heimyespecialmente ya que la compartición de sólo lectura (ej: código) es permisible
Heimyzwane] Alan_Q: Todo esto debe volverse realmente interesante con CPU con hyperthread
Heimyzwane: hay razones con las que Ingo está jugando para obtener el mejor rendimiento de tales procesadores 8)
HeimyCon hyperthreading tienes algo así como dos procesadores por caché
HeimyY la caché tiene además algunos límites internos bastante tontes
Heimytontos
Heimyzwane] Alan_Q: Crees entonces que bastaría sólo con el planificador? How about leveraging cpu affinity for say doing bias in interrupt handling?
Heimy(lo siento, muy complicado para traducir ahora mismo)
Heimyzwane: hay muy buenas razones en algunos casos para despertar un proceso en la CPU que controló una interrupción. En la mayoría de los casos, sin embargo, no es tan valioso como pudieras creer
HeimyLa mayoría de los datos del proceso está en caché en la CPU en la que se ejecutó por última vez
HeimyLa mayoría de los dispositivos de E/S buenos usan DMA (de manera que escriben a memoria ellos mismos y la memoria subre la que han escrito ha de ser eliminada de la caché de los procesadores (ya que la modificaron)
HeimyHay buenas razones para asignar interrupciones a procesadores específicos
Heimy(si el procesador 1 tiene en caché todos los datos de la eth0, entonces por qué gestionar la interrupción con el procesador 2)
Heimysh0nX] de manera que, si un programa está escrito para UP (uniproceso), cómo controla el planificador del núcleo sus datos en dos CPU? o no puede?
Heimysh0nX: el planificador no puede dividir algo con un único thread de ejecución. Puede separar varias aplicaciones (de manera que ejecuta tu juego en un procesador, y el servidor X en otro)
Heimysarnold] Alan_Q: ¿Tiene Linux actualmente algún mecanismo para especificar que todas las interrupciones deberían ser gestionadas por una CPU específica?
Heimysarnold: tiene algo que hizo Ingo, en el lado oscuro y peligroso de los ajustes del kernel
Heimysh0nX] Ya veo, entonces tenemos que usar threads en el código para beneficiarnos de tener SMP
Heimysh0nX: usar dos programas a veces es igual o más sencillo
HeimyHay un último tema para esta charla, y entonces podremos pasar a las preguntas
HeimyAlguien pregunto al principio al respecto de ayudar a la caché
HeimyEn los procesadores modernos, tenemos instrucciones como "prefetch" y "prefetchw"
HeimyPermiten decirle al procesadore que necesitarás datos en el futuro
HeimyDe manera que en lugar de estar parados esperando a que los datos lleguen de la memoria, se le puede indicar al procesador con antelación
HeimyEl gran problema es que a menudo no sabemos bien con antelación qué memoria vamos a necesitar
HeimyUna copia de memoria es fácil (y la copia de memoria en los Athlon en Linux realmente dice: "y prefetchéame 320 bytes antes de este punto")
HeimyCosas similares como el proceso de gráficos se benefician inmensamente de esto ya que los programas usan grandes cantidades de datos de forma predecible
Heimy(fortran se comporta muy bien en esto, extrañamente)
HeimyUsamos esto en el núcleo para hacer copias de memoria y algunas veces para listas
Heimyes difícil de usar para listas porque la memoria es tan lenta que prefieres decir: "prefetchéame unos 5 o 6 elementos"
Heimy<Alan> <espera por el traductor> [prefetchéame un traductor ;)]
HeimyOk. Parece que los dedos del traductor están al día
HeimyLo que necesitamos realmente para hacer que esto funcione es nuevas estructuras de datos
Heimyuno de los enfoques comunes para esto es tener listas en que conozcamos siguiente/anterior, pero también 'cinco elementos por delante' y 'cinco elementos por detrás'. No hacemos esto actualmente en el núcleo
Heimypero podría ser algo a lo que mirásemos en el futuro según los procesadores se hagan aún más rápidos
HeimyLa última cosa útil para la que se usa prefetch en el núcleo hace uso del 'prefetchw' del Athlon que dice "quiero estos datos pronto, y escribiré en ellos"
Heimyal contrario que prefetch, esto obtiene una copia exclusiva de los datos. Lo usamos para obtener cerrojos con antelación (lo que sería muy costoso si tenemos que hacerlo en memoria principal)
HeimyEs muy común que una estructura de cerrojo perteneza a otro procesadore y a menudo sabemos cuándo va a usarse, de manera que podemos pedirlo con antelación
Heimysh0nX] Asumo que hay algún tipo de spinlock para evitar que otro proceso pida con antelación los mismos datos?
HeimyEn realidad no lo bloqueamos
Heimycon muy poca frecuencia los pillamos con antelación y otra cpu los roba y los tenemos que coger otra vez
Heimypasa tan raramente que es menos costoso no preocuparse de esto
HeimyTambién si quisieras un cerrojo para el cerrojo, también querrías anticipar la anticipación
Heimyy así repetitivamente
HeimyDe manera que en el núcleo tratamos estas anticipaciones más como una ayuda
HeimySi hace lo correcto la mayor parte de las veces, ya está bien con eso...
HeimyOk. Hemos llegado al final de la parte principal de la charla
Heimyespero que haya dado alguna idea a la gente de por qué las caché importan
Heimyy un poco sobre programar teniéndolas en mente
HeimySi podemos empezar con preguntas sobre el tema antes de que nos vayamos por las ramas, sería mejor
Heimy<riel> Creo que la gente debería hacer las preguntas sobre el tema en #qc
Heimy<riel> así podremos tener el canal moderado unos minutos más
Heimysarnold:#qc] Alan2: me he estado preguntando si la peteición con antelación reduce significativamente el acceso a memoria
Heimy   ¿lo ha probado la gente sin configurar el prefetching?
Heimysarnold: hemos hecho una buena cantidad de pruebas. La mayoría de las veces, el prefetching ayuda realmente a la reducción del uso del ancho de banda de la memoria, que podría estarse usando para otras cosas
HeimyEl del Ahtlon estaba tan bien afinado que incluso destrozamos algunos chipset VIA debido bugs del hardware 8)
Heimyrene:#qc] Alan2: la charla parece haber estado referida sólo a la caché. Hacen mucha diferencia en los procesadores modernos cosas como la alineación de las instrucciones?
Heimyrene: importan un poco (depende del procesador cuánto). gcc sabe cómo hacerlo correctamente cuando le indicas el tipo de procesador. Sin embargo, normalmente está por debajo del 1%
HeimyArador:#qc] Alan2: cuales son los efectos de preempt sobre la caché?
Heimyarador: cuanto más cambias entre tareas menos útil se hace la caché
HeimyPre-empt no representa realmente una gran diferencia
HeimyEs por esto, sin embargo, por qué los sistemas diseñados para un montón de usuarios simultáneos tienen mucha caché
Heimy[14-Dec:19:55 aka_mc2:#qc] ALAN: piensas que el procesador Crusoe, soportado por Linux, podría considerarse para todas estas técnicas de programación?
Heimyaka_mc2: Es muy difícil tratar con el Crusoe: el sistema emula un x86 y ajusta su emulación de acuerdo a cosas que aprende durante la ejecución. Esto significaque puede averiguar lo que parece necesitar prefetching y muchas otras cosas que no puede hacer un procesador normal. Cuánto consigue realmente, no lo sé
Heimysklav:#qc] he notado grandes cargas tras usar un núcleo con -O3 o -O5
Heimysklav: mucho de esto está relacionado con la caché en realidad (gcc -O3 y -O5 desenrolla bucles que le hacen usar mucha más memoria y en CPUs modernas esto es malo)
Heimyen realidad es un fallo en algunos gcc que lo hace demasiado a menudo
Heimyjmgv:#qc] Alan? no piensas que gran parte del trabajo del uso de los registros y otras cuestiones dependen del compilador y nos hacen perder algo de control sobre estos asunto?
Heimyjmgv: cierto (pero querrías optimizar a mano un megabyte de codigo?)
Heimyjmgv: para el núcleo, en realidad, escribimos pequeñas partes de código críticas en ensamblador, en algunos casos (cosas como memcpy, por ejemplo)
Heimyhay otras partes en las que el C se escribe de manera que el compilador produzca el código correcto, en vez de a la manera obvia
HeimyRapiere: Si GCC mejora el uso de la caché de un thread, ¿no repercute esto en la interactividad en multi-threads?
Heimy<jmgv> ya veo
HeimyRapiere: el planificador trata con esto a nivel mucho más alto (y las decisiones que hace que están diseñadas para un mejor rendimiento de la caché son, afortunadamente, las correctas, de todas maneras)
Heimysapan:#qc] Alan2: dijiste que "sabemos que sólo se puede cachear cierta cantidad de memoria y sólo ciertos desplazamientos". ¿Podrías explicarlo?
HeimyEl procesador usa partes de las direcciones para indicar en qué parte de la caché debe miar
HeimyPara la CPU, una dirección realmente parece algo así como [Número de página][Línea de caché][índice dentro de la caché]
HeimyDe manera que la caché siempre almacena un área de unos 64 bytes en un athlon
HeimyAdemás, si tenemos muchos datos con el mismo número de línea de caché, sólo podemos almacenar dos o cuatro de estos pedazos de datos
Heimyla caché no puede almacenar cualquier bloque de datos en cualquier sitio
HeimyOk. Podemos pasar a preguntas más generales un rato (Rik, ¿para cuándo está planeada la siguiente charla?)
Heimycoywolf!jack@210.83.202.168* ¿por qué piensas que los GUI de Windows son mucho más rápidos que los de Linux?
Heimycoywolf: porque no asisitieron a mi conferencia 8)
Heimycoywolf: pero podrías usar xfce/rox incluso en un PC de 32MB 8)
Heimyerm...
Heimycoywolf: pero deberías intentar usar xfce/rox incluso en un PC de 32MB 8)
HeimyEso :)
Heimysh0nX:#qc] ya que ahora estamos fuera de tema: Alan2: ¿Tienes un parche para el módulo amd76x_pm para 2.5xx?
Heimyshonx: no sería muy difícil adaptarlo, pero no creo que nadie lo haya hecho aún
Heimyshonx: cool
Heimy:)
Heimy(sh0nX:#qc] Alan2: estoy intentando adaptarlo ahora mismo)
Heimysapan:#qc] Alan2: tengo una iPAQ con familiar y 2.4.18-rmk. Si fuera a optimizar cosas en el núcleo o aplicaciones en general, ¿a qué debería mirar?
Heimysapan: Ahora mismo no estoy familiarizado con las tripas del ARM. Deberían aplicarse los mismos principios generales
Heimysapan: obviamente hay otras consideraciones en un handheld (falta de disco, ahorro de energía, etc)
HeimyE0x:#qc] Alan2 ¿cual es tu procesador preferido?
HeimyEOx: varía. Me encanta la velocidad bruta del Athlon, pero odio su fiabilidad y los problemas de calor
HeimyEn este momento estoy jugando con los procesadores VIA C3/VIA Eden (que son mucho más lentos, pero están diseñados para ser muy evicientes en cuanto a energía - no necesitan ventilador)
Heimyesto les hace sistemas muy baratos y silenciosos
Heimyademás la gente puede hacer cosas realmente locas con placas pequeñas (como ponerlas en viajas carcasas de sparc o incluso en latas de gasolina)
Heimy(www.mini-itx.com)
Heimyridiculum] ¿cual es tu opinión sobre itanium2? es mejor que hammer?
Heimyridiculum: ahora mismo me quedo firmemente con hammer
HeimyAl respecto de por qué la fiabilidad de los athlon es un problema, no estoy seguro (tenemos verdaderos problemas obteniendo memoria fiable en los athlon duales, problemas de calor y mucha incompatibilidad de hardware)
Heimypero es asombrosamente rápido una vez funciona
Heimyapuigsech:#qc] Alan, en la tabla GDT podemos encontrar algunos descriptores nulos (sin usar), ¿es esto para obtener optimizaciones en el uso de la memoria caché?
Heimyapui: realemente muchos de esos huecos existen porque los solíamos usar para cosas y quisimos mantener los datos iguales, otros son valores fijos requeridos por los estándares, o para compatibilidad en bios con fallos de Windows (no tiene que ver con la caché)
Heimyrene] (de manera que CPU no machaquen las líneas de caché de otros)
Heimyrene: tenemos que espaciar algunas cosas para eso
Heimyperdón
Heimyrene: tenemos que dejar espacio eso
Heimyrene: Un ejemplo es que el núcleo tiene una estructura que describe cada página de memoria
HeimyVarias personas trabajaron realmente duro para hacer que las estructuras fueran exactamente de 64 bytes en PC
Heimysh0nX] Alan: ¿visitas #kernelnewbies? :)
Heimy<Alan> shonx: no demasiado a menudo (es un proyecto realmente importante)
Heimy<davej> la gente que esté interesada en las cosas de prefetching de que ha hablado Alan podrían encontrar interesante la presentación que hay en http://208.15.46.63/events/gdc2002.htm interesting
Heimy<riel> vale, parece están habiendo menos preguntas
Heimy<riel> supongo que es hora de cerrar la "parte oficial" de esta charla
Heimy<jmgv> Sí, estoy de acuerdo
Heimy<riel> me gustaría agradecer a Alan Cox esta interesante charla
Heimy<riel> y me gustaría recordarle a todo el mundo que todavía tenemos otras charlas en UMEET
Heimy<jmgv> agradecemos a alan sus esfuerzos
Heimy<riel> pueden ver el programa completo en http://umeet.uninet.edu/umeet2002/spanish/prog.html
jacobosupongo que ya no hace falta :)
angelLuisplas plas plas plas plas plas plas plas plas
angelLuisplas plas plas plas plas plas plas plas plas
angelLuisplas plas plas plas plas plas plas plas plas
angelLuisplas plas plas plas plas plas plas plas plas
pancake:)
angelLuisgracias por la traducción! thanks to the traduction!
Ston_clap clap clap clap clap
Ston_clap clap clap clap clap
Ston_clap clap clap clap clap
Ston_clap clap clap clap clap
angelLuisplas plas plas plas plas plas plas plas plas
Ston_clap clap clap clap clap
angelLuisplas plas plas plas plas plas plas plas plas
angelLuisplas plas plas plas plas plas plas plas plas
* Heimy señala a jacobo
angelLuis:))))
Ston_se perdio y atrazo pero gracias :)
angelLuisplas plas plas plas plas plas plas plas plas
angelLuisplas plas plas plas plas plas plas plas plas
* jacobo levanta a Heimy en el aire :)
bit0plas plas plas plas
angelLuis;)
bit0graaaaaaaaaaaaaacias
* Heimy se cae sobre jacobo, para gran dolor suyo
angelLuisplas plas plas plas plas plas plas plas plas
jacoboHeimy: la cuchara no existe
bit0plas plas plas plas
bit0plas plas plas plas
bit0plas plas plas plas
bit0plas plas plas plas
bit0plas plas plas plas
BorZunggracias por la currada Heimy ;)
Heimygracias público, gracias, gracias
Heimyjacobo: locualo?
_Yep_
Heimyjacobo: ah, sí
HeimyXD
^hulk-18plas plas plas plas plas plas plas plas plas
casanegraclap clap clap
^hulk-18plas plas plas plas plas plas plas plas plas
casanegra:-)
^hulk-18plas plas plas plas plas plas plas plas plas
[k]creo que lo mejor no fue alan si no la traduccion :P
jacoboque esto es Matrix, todo es posible y para más, no me duele :D
debUgo-felicitaciones y agradecimientos a todos los que colaboraron en la traducción... estuvo fabulantástica
angelLuisplas plas plas plas plas plas plas plas plas
angelLuisplas plas plas plas plas plas plas plas plas

Generated by irclog2html.pl 2.1 by Jeff Waugh - find it at freshmeat.net!