Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Lección 10. Medición y tiempo
Lección 10. Medición y tiempo
En este video, los oradores analizan varios aspectos de la medición y el tiempo en la informática, incluidos los factores externos que pueden afectar la precisión. Hacen hincapié en la necesidad de modelos y una comprensión clara de los datos, reduciendo la varianza para compensar los errores y utilizando llamadas de sincronización adecuadas para garantizar la confiabilidad. También analizan los desafíos para medir el rendimiento del software con precisión, como la ley de potencia y los factores no deterministas, al tiempo que destacan herramientas como el modelado de rendimiento, las llamadas de tiempo, los contadores de hardware y los simuladores. Finalmente, advierten que no se debe confiar en una sola herramienta y recomiendan la triangulación y la adaptación como técnicas para garantizar resultados precisos.
El ponente explica la importancia de una medición fiable del rendimiento en la ingeniería de software de rendimiento. Recomienda el uso de estadísticas para medir con precisión el rendimiento y analiza varios tipos de estadísticas resumidas, como la media, que pueden proporcionar medidas útiles de rendimiento en diferentes contextos. Señala que tomar la media aritmética de las proporciones no es un enfoque válido y sugiere usar la media geométrica en su lugar. El orador enfatiza la importancia de elegir la forma correcta de agregar datos al comparar programas y sugiere tomar la estadística de orden inferior, como el mínimo o el 10 %, de varias ejecuciones para comparar el rendimiento con mayor precisión. El orador también analiza diferentes metodologías para medir y comparar el desempeño, incluida la comparación directa y el ajuste de un modelo para derivar estadísticas, pero advierte sobre el problema del ajuste excesivo en el modelado. En general, el video enfatiza la importancia de una medición confiable del desempeño para mejorar el desempeño del programa.
Lección 11. Asignación de almacenamiento
Lección 11. Asignación de almacenamiento
El disertante analiza la asignación de almacenamiento en este video, cubriendo tanto la asignación como la liberación de memoria. Se abordan diferentes tipos de almacenamiento, incluidos la pila y el montón, así como esquemas de asignación de tamaño fijo y variable. También se analiza la fragmentación externa provocada por la distribución de bloques de memoria, con soluciones como listas libres o mapas de bits por página de disco. También se introduce el concepto de recolección de basura, incluido el conteo de referencias y las limitaciones de este algoritmo. También se explican los procedimientos de recolección de basura "marcar y barrer" y "detener y copiar", con un enfoque en cómo este último aborda la fragmentación y el posible problema de corrección creado por las actualizaciones de puntero. El video concluye con notas sobre la complejidad temporal y espacial del algoritmo de parada y copia y su eliminación de la fragmentación externa.
Este video cubre varios temas relacionados con la asignación de almacenamiento dinámico, incluido el sistema Buddy, los procedimientos de marcado y barrido, las optimizaciones, la recolección de basura generacional y en tiempo real, la asignación de almacenamiento de subprocesos múltiples y la recolección de basura paralela. El disertante explica que la recolección de basura generacional se basa en la idea de que los objetos más jóvenes se escanean con mayor frecuencia, mientras que la recolección de basura en tiempo real se ejecuta en segundo plano durante la ejecución del programa, pero puede generar problemas de corrección si el objeto y el gráfico del puntero siguen cambiando. Finalmente, la lección resume los diferentes tipos de asignación de almacenamiento, incluidos los de pila y pila, y los diferentes métodos de recolección de elementos no utilizados, como el recuento de referencias, marcar y barrer y detener y copiar. El disertante menciona que los estudiantes podrán probar algunos de estos métodos en su próxima tarea.
Lección 12. Asignación de almacenamiento en paralelo
Lección 12. Asignación de almacenamiento en paralelo
El video analiza varias estrategias de asignación de memoria y sus compensaciones. Se explica el uso de malloc y asignación alineada, así como la importancia de la desasignación de memoria adecuada con libre. También se cubre el uso de Mmap para la asignación de memoria virtual, junto con los problemas de fragmentación externa y rendimiento lento. Se explora el concepto de pilas en la programación C y C++, con énfasis en un enfoque de pila de cactus basado en montón para asignar marcos de pila, lo que puede conducir a mejores pruebas limitadas al espacio y límites superiores. También se analiza el uso de un conjunto de pilas lineales, junto con la importancia de optimizar los bloques pequeños para minimizar la fragmentación. El video concluye con una discusión sobre los enfoques de montones globales y locales y sus problemas potenciales, junto con enfoques como las listas de contenedores libres y el reequilibrio periódico de la memoria para abordar estos problemas.
El video también analiza soluciones para la asignación de almacenamiento en paralelo y presenta el asignador Hoard como una solución. El asignador de tesoros utiliza una combinación de montones locales y globales y grandes superbloques que se pueden mover entre montones para reducir el uso compartido falso, mejorar la escalabilidad y reducir la fragmentación externa. El almacenamiento máximo asignado en el almacenamiento dinámico global es, como máximo, el almacenamiento máximo asignado en los almacenamientos dinámicos locales, y el espacio está limitado por el espacio ocupado por el usuario más el almacenamiento asignado pero no utilizado en los almacenamientos dinámicos locales. El video también analiza brevemente otros asignadores como Je malloc y Super malloc, con resultados de referencia que indican que Super malloc se desempeñó mejor que Je malloc y Hoard. La discusión concluye con una referencia a las diapositivas en línea para obtener detalles sobre la recolección de elementos no utilizados.
Lección 13. El sistema de tiempo de ejecución de Cilk
Lección 13. El sistema de tiempo de ejecución de Cilk
El sistema de tiempo de ejecución de Cilk es responsable de programar y equilibrar la carga de los cálculos en procesadores paralelos, utilizando un programador de robo de trabajo aleatorio para asignar los cálculos a los procesadores en tiempo de ejecución. El sistema está diseñado para optimizar la ejecución en serie del programa, incluso a expensas de un costo adicional a los robos. El trabajador mantiene una estructura de datos de cubierta separada que contiene punteros a los marcos de pila y utiliza punteros de cabeza y cola. Las tramas que están disponibles para ser robadas tienen una estructura local adicional que contiene la información necesaria para que ocurra el robo mientras la cubierta es externa a la pila de llamadas. La sección explica cómo el sistema permite que los procesadores comiencen a ejecutarse desde la mitad de una función en ejecución y cómo la sincronización entre procesadores se complica cuando se llega a una declaración de sincronización que no puede ejecutarse más allá del punto porque los procesadores específicos todavía están esperando que finalicen los cálculos. Además, el orador aborda el rendimiento del sistema, las consideraciones de diseño y las estructuras de datos, y cómo el sistema optimiza la ejecución utilizando el protocolo THC, que involucra dos conjuntos de protocolos, uno para el trabajador que ejecuta el trabajo y otro para el ladrón.
El sistema de tiempo de ejecución de Cilk utiliza un protocolo de salto fijo y de salto largo para manejar el robo de cálculos de las cubiertas de ejecución de los procesos víctimas. La abstracción Cactus Stack permite que el proceso ladrón tenga su propia pila de llamadas para evitar la corrupción de las pilas de la víctima. El protocolo de sincronización del sistema utiliza un árbol de cálculos y una pila de cactus para garantizar que la sincronización solo se produzca entre cálculos anidados dentro de una función. Full Frame Tree mantiene relaciones padre-hijo entre cálculos con subcálculos pendientes para simplificar el proceso de sincronización. Además, el sistema de tiempo de ejecución optimiza el caso común en el que la función actual no tiene cálculos secundarios pendientes y todos los trabajadores están ocupados. Otras funciones admitidas incluyen excepciones de C++, hiperobjetos reductores y genealogías.
Lección 15. Algoritmos olvidados de la memoria caché
Lección 15. Algoritmos olvidados de la memoria caché
El video analiza los algoritmos que ignoran la memoria caché, que pueden ajustarse automáticamente al tamaño de la memoria caché en una máquina, lograr una buena eficiencia de la memoria caché y no requieren el conocimiento de los parámetros de la memoria caché de la máquina. El video muestra cómo escribir código para simular la difusión de calor a través de ecuaciones diferenciales utilizando el método de plantilla en una matriz 2D. El código tiene versiones en bucle y trapezoidal, siendo esta última más eficiente en caché pero no significativamente más rápida en una simulación 2D debido a la previsibilidad del patrón de acceso del código en bucle. El video también analiza la interacción entre el almacenamiento en caché y el paralelismo y el diagnóstico de posibles cuellos de botella de aceleración paralela. Finalmente, el orador explica los cálculos de plantillas y cómo se actualiza cada punto en una matriz utilizando un patrón fijo llamado plantilla, que puede sufrir fallas de caché y tiene requisitos de almacenamiento que pueden reducirse utilizando algoritmos eficientes que explotan la localidad temporal y espacial.
La segunda parte del video analiza los algoritmos que olvidan la memoria caché para clasificar y fusionar. Específicamente, el video cubre la complejidad de caché del ordenamiento por fusión, presenta el concepto de fusión multidireccional y explica la complejidad de caché del algoritmo de fusión multidireccional. El video también trata sobre el algoritmo de ordenación de embudo, que es un algoritmo de ordenación sin memoria caché que puede fusionar K elementos cuadrados y K listas ordenadas. El algoritmo de clasificación de embudo es óptimo y se construye recursivamente con la raíz cuadrada de K embudos. El video explica que hay muchos otros algoritmos y estructuras de datos que no tienen en cuenta la memoria caché, como árboles b, mantenimiento ordenado de archivos y colas de prioridad. En general, el video proporciona una introducción a los algoritmos que olvidan la memoria caché para aquellos interesados en aprender más sobre el tema.
Lección 16. Programación paralela no determinista
Lección 16. Programación paralela no determinista
Este video analiza varios conceptos relacionados con la programación paralela determinista y no determinista. El ponente destaca la importancia de evitar el no determinismo, ya que puede dar lugar a comportamientos anómalos y una depuración difícil. Las estrategias para gestionar el no determinismo incluyen el uso de valores fijos, reproducción de registros, herramientas de análisis, encapsulación y pruebas unitarias. El uso de mutexes se explora en detalle, incluido giro frente a rendimiento, reentrante frente a no reentrante y justo frente a injusto. El ponente también toca el concepto de cambio de contexto y el "problema del alquiler de esquís" en el contexto de la programación paralela. El segmento concluye discutiendo los principios básicos de la ingeniería de rendimiento en procesadores multinúcleo.
La segunda parte del video cubre el problema del interbloqueo en la programación paralela y ofrece soluciones para evitarlo, como la ordenación lineal de mutexes que garantiza que no haya ciclos de espera. Además, el orador presenta el concepto de memoria transaccional, que garantiza la atomicidad al representar una región crítica como una transacción que confirma todas las actualizaciones a la vez. Luego, el video presenta un algoritmo que utiliza un enfoque basado en bloqueos con una matriz de propiedad finita y un método de solicitud de clasificación de liberación para evitar interbloqueos e inanición sin necesidad de un bloqueo global. Por último, se explica el algoritmo de liberación, ordenación y readquisición, que evita que varios bloqueos intenten adquirir un bloqueo simultáneamente, lo que evita problemas de rendimiento.
Lección 17. Sincronización sin bloqueos
Lección 17. Sincronización sin bloqueos
Charles Leiserson explora el concepto de sincronización sin bloqueos en un video de YouTube. Brinda un ejemplo que demuestra la necesidad de un orden lineal global de instrucciones para garantizar la ejecución secuencial y explica cómo se puede lograr la exclusión mutua a través de la coherencia secuencial, evitando las dificultades y los problemas potenciales del uso de bloqueos. Leiserson presenta el algoritmo de Peterson como una solución que usa solo operaciones de carga y almacenamiento para acceder a secciones críticas sin interferencia de procesos concurrentes. El video también cubre los desafíos de la sincronización a través de la memoria debido al reordenamiento del hardware y el concepto de vallas de memoria para mantener el orden relativo con otras instrucciones. Leiserson argumenta que admitir la consistencia secuencial para máquinas paralelas es beneficioso pero difícil de lograr para los diseñadores de hardware.
La segunda parte del video analiza el uso de vallas de memoria e instrucciones de sincronización para prevenir errores en programas paralelos. El orador explora diferentes formas de implementar barreras de memoria, implícita o explícitamente, y la importancia de una ingeniería y coordinación cuidadosas entre diferentes equipos que trabajan en diferentes aspectos de un procesador. Además, el disertante analiza el uso de instrucciones CAS como parte del algoritmo sin bloqueo en el estándar de lenguaje C11 para implementar mutexes de algoritmos de exclusión mutua sin interbloqueo de n subprocesos utilizando solo espacio constante. Charles Leiserson explica el problema de usar bloqueos en un sistema de subprocesos múltiples y la solución de usar CAS en su lugar, ya que un subproceso que mantiene el bloqueo durante mucho tiempo puede potencialmente bloquear otros subprocesos que esperan acceder al mismo recurso. Además, el video destaca el problema potencial del problema ABA con la comparación y el intercambio y alienta a los interesados en el tema a obtener más información sobre los algoritmos sin bloqueo.
Lección 18. Idiomas específicos de dominio y autotuning
Lección 18. Idiomas específicos de dominio y autotuning
En este video, el profesor Saman Amarasignhe del departamento EECS del MIT analiza los beneficios del uso de lenguajes específicos de dominio (DSL) y el ajuste automático en la ingeniería de rendimiento. Él enfatiza la importancia de los DSL, que capturan dominios específicos del área que son difíciles de describir en lenguajes de propósito general, lo que permite a los programadores aprovechar el conocimiento de los expertos del dominio para un mejor rendimiento. Singh analiza la optimización de los procesos de gráficos mediante DSL, incluida la partición de gráficos y la importancia de la forma del gráfico en el cálculo. Presenta DSL Halide para el procesamiento de imágenes, que permite una rápida optimización del código y portabilidad entre máquinas. Habla del uso de Halide en varias industrias como Google y Adobe. En última instancia, destaca la importancia de experimentar con diferentes enfoques para optimizar el código mientras se enfoca en el paralelismo, la localidad y el trabajo redundante.
El video también habla sobre los desafíos de la ingeniería de rendimiento y la búsqueda de los parámetros óptimos para que un programa se ejecute de manera eficiente. El orador sugiere que el ajuste automático puede abordar este problema al buscar automáticamente en el gran espacio de parámetros para encontrar los valores óptimos. Señala que la búsqueda exhaustiva puede ser poco práctica y que las soluciones basadas en heurísticas pueden no ser óptimas. El ajuste automático, que define un espacio de valores aceptables e itera en función de los resultados de rendimiento, puede acelerar el proceso de búsqueda de soluciones óptimas. El orador también analiza la aplicación del ajuste automático en la generación de horarios para Try, que pudo producir horarios de manera más eficiente y efectiva que la búsqueda exhaustiva.
Lección 19. Leiserchess Codewalk
Lección 19. Leiserchess Codewalk
En este video de YouTube titulado "19. Leiserchess Codewalk", Helen Xu explica las reglas de Lesierchess, un juego jugado por dos equipos con el objetivo de dispararle al rey del equipo contrario o que le disparen a su rey. El juego tiene dos tipos de movimientos, movimientos básicos y swat, y una regla de Ko que hace que un movimiento sea ilegal si deshace el movimiento más reciente del oponente. Xu se sumerge en varios aspectos del juego, incluido el método de control de tiempo de Fisher, la notación de Forsythe-Edwards, el probador automático de la nube y la organización de proyectos, evaluando y comparando bots usando clasificaciones Elo, generación de movimientos, evaluación estática y algoritmos de búsqueda como alfa-beta, variación de principio, poda de subárboles y tablas de transposición. También analiza la importancia de la infraestructura de prueba para optimizar el programa y el archivo eval.c, que contiene heurísticas que evalúan cada casilla del tablero según el tipo de pieza y su color.
El orador también profundiza en el aspecto de la cobertura láser del juego, explicando el complicado sistema de generar todos los movimientos posibles para una posición basada en el color del jugador usando una declaración de tiempo real. También explican la importancia de la corrección en el código y cómo probarlo, sugiriendo la conversión de la representación para garantizar la corrección antes de la optimización del rendimiento. El orador también analiza la gran flexibilidad que brinda la interfaz UCI de Leiserchess, que permite a los usuarios editar tablas y comandos a su gusto, y asegura a los espectadores que se limpiará el código inactivo y que se debe informar cualquier otro error para corregirlo.
Lección 20. Paralelismo especulativo y Leiserchess
20. Paralelismo especulativo y Leiserchess
En este video de YouTube titulado "20. Paralelismo especulativo y Leiserchess", el instructor presenta el concepto de paralelismo especulativo, que consiste esencialmente en adivinar de manera preventiva que ciertas tareas se pueden realizar en paralelo y pueden resultar en un código más rápido. Sin embargo, el orador advierte que este código no es determinista y solo debe usarse cuando sea necesario, al tiempo que advierte contra su uso en los casos en que se podría usar un código de serie mejor. Una parte importante del video gira en torno a la discusión de búsquedas alfa-beta paralelas, lo que implica podar el árbol del juego para optimizar el tiempo de búsqueda, y también habla sobre diferentes estructuras de datos y heurísticas utilizadas en el proceso de evaluación de los algoritmos de búsqueda, particularmente para evitar ciclos e inactividad. buscar. El video también aborda los beneficios de la profundización iterativa y cómo conduce a un mejor orden de movimiento para las búsquedas, al tiempo que analiza el hash de Zobrist, una técnica de optimización utilizada en los algoritmos de búsqueda que implica un valor hash único para cada posición en el tablero de ajedrez con las mismas piezas.
Este video también analiza varias técnicas de optimización para motores de ajedrez, como tablas de transposición, reducciones de movimientos tardíos y el uso de bitboards para la generación de movimientos. El orador también habla sobre el tema del "paralelismo especulativo y Leiserchess", donde aconseja a los programadores que evalúen si un movimiento afecta la trayectoria del láser y que busquen la "cobertura del láser". El orador sugiere dejar las representaciones antiguas en el código y usar programas para probar los cambios. También desarrollaron una heurística para medir qué tan cerca está un láser del Rey en Leiserchess. Más sugerencias de optimización incluyen encontrar una mejor manera de evaluar la proximidad del oponente al láser del jugador y optimizar la clasificación de los movimientos. Finalmente, se analiza la importancia de refactorizar y probar correctamente el código.