Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Cours 7. Races et parallélisme
Cours 7. Races et parallélisme
La vidéo couvre une gamme de sujets liés aux races, au parallélisme et aux dags de calcul dans la programmation Silk. Certains concepts clés couverts incluent les instructions spawn et sync pour une exécution simultanée, l'importance d'éviter les conditions de concurrence et l'utilisation du détecteur de course de Silk pour les identifier. La vidéo couvre également la loi d'Amdahl, la loi de travail et la loi d'étendue comme moyens de quantifier la quantité de parallélisme dans un programme, ainsi que des moyens d'analyser le travail et l'étendue des calculs. L'accélération et le parallélisme potentiels des algorithmes de tri parallèle et le concept de la théorie de l'ordonnancement sont également discutés, en mettant l'accent sur le théorème de l'ordonnanceur glouton. Dans l'ensemble, la vidéo fournit des informations précieuses sur la compréhension et l'optimisation des performances du programme dans la programmation Silk.
La vidéo explique les corollaires de la limite de l'ordonnanceur gourmand, qui stipule essentiellement que tout ordonnanceur gourmand atteint une accélération linéaire presque parfaite tant que T1/Tinfinity est supérieur ou égal à P^2. Le planificateur de soie, qui utilise un planificateur de vol de travail, peut atteindre une accélération linéaire presque parfaite tant que le nombre de processeurs est bien inférieur à T1/Tinfinity. Le système d'exécution de la soie fonctionne en maintenant un pont de travail de brins prêts et manipule le bas du pont comme une pile. La vidéo traite également de Cactus Stack, qui permet plusieurs vues de piles en parallèle et rend possible les appels de fonctions parallèles. La limite supérieure de l'espace de pile requis par l'exécution du processeur P est souvent beaucoup plus lâche que la quantité réelle nécessaire, car chaque processeur n'a peut-être pas besoin de parcourir tout le graphe de calcul à chaque fois qu'il vole du travail.
Cours 8. Analyse des algorithmes multithreads
Cours 8. Analyse des algorithmes multithreads
Cette vidéo présente la méthode principale d'analyse des récurrences de diviser pour mieux régner et l'applique aux algorithmes multithreads en comparant la base logarithmique B de n à la base logarithmique B de A avec F de N pour déterminer leur croissance en n et le travail requis. La vidéo présente une feuille de triche avec des solutions pour les algorithmes multithreads de base et couvre des sujets tels que l'analyse du travail et de la durée, l'efficacité du travail et la maîtrise des frais généraux grâce à l'optimisation de la taille du grain. L'importance de l'empathie lors de la communication de sujets techniques est soulignée, et le concept d'un DAG est introduit comme moyen d'équilibrer le travail et la portée pour augmenter le parallélisme et réduire le temps d'exécution.
La vidéo traite également de l'analyse des algorithmes multithreads, en se concentrant sur le travail et l'étendue, et sur la façon de maximiser le parallélisme tout en minimisant l'étendue pour obtenir une accélération linéaire presque parfaite. L'orateur suggère une approche diviser pour mieux régner pour les algorithmes multithreads, où le nombre de tâches attribuées aux threads est suffisamment important, et met en garde contre la génération de nombreuses petites tâches en raison des frais généraux de planification. L'exemple de code présenté en comprend un efficace et un moche. L'orateur explique également comment représenter les sous-matrices dans le codage et l'indexation bidimensionnels et met l'accent sur l'utilisation de « restreindre » dans le code de multiplication matricielle diviser pour régner pour améliorer les performances.
Cours 9. Ce que les compilateurs peuvent et ne peuvent pas faire
Cours 9. Ce que les compilateurs peuvent et ne peuvent pas faire
Cette vidéo explique comment les compilateurs peuvent optimiser le code, à l'aide de divers exemples. Il explique comment les compilateurs peuvent éliminer les références de stockage et de mémoire inutiles, et comment ils peuvent optimiser les boucles pour améliorer les performances.
Cette vidéo explique également le concept des passes d'optimisation du compilateur et comment elles peuvent être utilisées pour améliorer les performances du code. Il aborde également les limites des compilateurs, notamment en ce qui concerne la vectorisation. Les compilateurs ne peuvent vectoriser le code que s'ils peuvent déterminer que les pointeurs dans le code ne seront pas des alias. Si les pointeurs font des alias, le compilateur ne pourra pas vectoriser le code. En tant que programmeur, vous pouvez aider le compilateur en annotant vos pointeurs pour fournir plus d'informations sur leur utilisation.
Cours 10. Mesure et chronométrage
Cours 10. Mesure et chronométrage
Dans cette vidéo, les conférenciers discutent de divers aspects de la mesure et de la synchronisation en informatique, y compris les facteurs externes qui peuvent affecter la précision. Ils soulignent la nécessité de modèles et d'une compréhension claire des données, de la réduction de la variance pour compenser les erreurs et de l'utilisation d'appels de synchronisation appropriés pour garantir la fiabilité. Ils discutent également des défis liés à la mesure précise des performances logicielles, tels que la loi de puissance et les facteurs non déterministes, tout en mettant en évidence des outils tels que la modélisation des performances, les appels de synchronisation, les compteurs matériels et les simulateurs. Enfin, ils mettent en garde contre le recours à un seul outil, recommandant la triangulation et l'adaptation comme techniques pour garantir des résultats précis.
Le conférencier explique l'importance d'une mesure de performance fiable dans l'ingénierie logicielle de performance. Il recommande l'utilisation de statistiques pour mesurer avec précision les performances et discute de divers types de statistiques récapitulatives telles que la moyenne, qui peuvent fournir des mesures utiles des performances dans différents contextes. Il souligne que prendre la moyenne arithmétique des rapports n'est pas une approche valable et suggère d'utiliser plutôt la moyenne géométrique. L'orateur souligne l'importance de choisir la bonne façon d'agréger les données lors de la comparaison des programmes et suggère de prendre la statistique d'ordre inférieur, comme le minimum ou 10 %, de plusieurs exécutions pour comparer plus précisément les performances. L'orateur discute également de différentes méthodologies pour mesurer et comparer les performances, y compris la comparaison directe et l'ajustement d'un modèle pour dériver des statistiques, mais met en garde contre le problème de l'ajustement excessif dans la modélisation. Dans l'ensemble, la vidéo souligne l'importance d'une mesure fiable du rendement pour améliorer le rendement du programme.
Cours 11. Allocation de stockage
Cours 11. Allocation de stockage
Le conférencier discute de l'allocation de stockage dans cette vidéo, couvrant à la fois l'allocation et la libération de mémoire. Différents types de stockage sont abordés, y compris la pile et le tas, ainsi que des schémas d'allocation de taille fixe et variable. La fragmentation externe causée par l'étalement des blocs de mémoire est également abordée, avec des solutions telles que des listes libres ou des bitmaps par page de disque. Le concept de ramasse-miettes est également introduit, y compris le comptage de références et les limites de cet algorithme. Les procédures de récupération de place « marquer et balayer » et « arrêter et copier » sont également expliquées, en mettant l'accent sur la façon dont cette dernière traite la fragmentation et le problème d'exactitude possible créé par les mises à jour de pointeur. La vidéo se termine par des notes sur la complexité temporelle et spatiale de l'algorithme d'arrêt et de copie et son élimination de la fragmentation externe.
Cette vidéo couvre divers sujets liés à l'allocation de stockage dynamique, notamment le système Buddy, les procédures de marquage et de balayage, les optimisations, la récupération de place générationnelle et en temps réel, l'allocation de stockage multithread et la récupération de place parallèle. Le conférencier explique que la récupération de place générationnelle est basée sur l'idée que les objets plus jeunes sont analysés plus fréquemment, tandis que la récupération de place en temps réel s'exécute en arrière-plan pendant l'exécution du programme, mais peut entraîner des problèmes d'exactitude si le graphique d'objet et de pointeur continue de changer. Enfin, la conférence résume différents types d'allocation de stockage, y compris la pile et le tas, et différentes méthodes de récupération de place, telles que le comptage de références, le marquage et le balayage et l'arrêt et la copie. Le conférencier mentionne que les étudiants pourront essayer certaines de ces méthodes dans leur prochain devoir.
Cours 12. Allocation de stockage parallèle
Cours 12. Allocation de stockage parallèle
La vidéo présente diverses stratégies d'allocation de mémoire et leurs compromis. L'utilisation de malloc et l'allocation alignée, ainsi que l'importance d'une désallocation de mémoire appropriée avec free, sont expliquées. L'utilisation de Mmap pour l'allocation de mémoire virtuelle est également couverte, ainsi que les problèmes de fragmentation externe et de ralentissement des performances. Le concept de piles dans la programmation C et C++ est exploré, l'accent étant mis sur une approche de pile de cactus basée sur le tas pour l'allocation des cadres de pile, ce qui peut conduire à de meilleures preuves liées à l'espace et à des limites supérieures. L'utilisation d'un pool de piles linéaires est également discutée, ainsi que l'importance de l'optimisation pour les petits blocs afin de minimiser la fragmentation. La vidéo se termine par une discussion sur les approches de tas globales et locales et leurs problèmes potentiels, ainsi que sur des approches telles que les listes de bacs libres et le rééquilibrage périodique de la mémoire pour résoudre ces problèmes.
La vidéo aborde également les solutions d'allocation de stockage parallèle et présente l'allocateur Hoard en tant que solution. L'allocateur Hoard utilise une combinaison de tas locaux et globaux et de grands super blocs qui peuvent être déplacés entre les tas pour réduire le faux partage, améliorer l'évolutivité et réduire la fragmentation externe. Le stockage maximal alloué dans le tas global est au maximum le stockage maximal alloué dans les tas locaux, et l'empreinte est limitée par l'empreinte utilisateur plus le stockage alloué mais inutilisé dans les tas locaux. La vidéo aborde également brièvement d'autres allocateurs tels que Je malloc et Super malloc, avec des résultats de référence indiquant que Super malloc a mieux performé que Je malloc et Hoard. La discussion se termine par une référence aux diapositives en ligne pour les détails de la collecte des ordures.
Cours 13. Le système d'exécution Cilk
Cours 13. Le système d'exécution Cilk
Le système d'exécution Cilk est responsable de la planification et de l'équilibrage de charge des calculs sur des processeurs parallèles, en utilisant un planificateur de vol de travail aléatoire pour mapper les calculs sur les processeurs au moment de l'exécution. Le système est conçu pour optimiser l'exécution en série du programme, même au prix d'un coût supplémentaire pour les vols. Le travailleur maintient une structure de données de pont séparée qui contient des pointeurs vers les cadres de pile et utilise des pointeurs de tête et de queue. Les trames qui sont disponibles pour être volées ont une structure locale supplémentaire qui contient les informations nécessaires pour que le vol se produise alors que le pont est externe à la pile d'appels. La section explique comment le système permet aux processeurs de commencer à s'exécuter à partir du milieu d'une fonction en cours d'exécution et comment la synchronisation entre les processeurs devient compliquée lorsqu'elle atteint une instruction de synchronisation qui ne peut pas s'exécuter au-delà du point car des processeurs spécifiques attendent toujours la fin des calculs. De plus, le conférencier aborde les performances du système, les considérations de conception et les structures de données, et comment le système optimise l'exécution à l'aide du protocole THC, impliquant deux ensembles de protocoles, un pour le travailleur exécutant le travail et un pour le voleur.
Le système d'exécution Cilk utilise un protocole de saut défini et de saut long pour gérer le vol de calculs à partir des ponts d'exécution des processus victimes. L'abstraction Cactus Stack permet au processus voleur d'avoir sa propre pile d'appels pour empêcher la corruption des piles de la victime. Le protocole de synchronisation du système utilise une arborescence de calculs et une pile Cactus pour garantir que la synchronisation ne se produit qu'entre les calculs imbriqués dans une fonction. L'arborescence complète maintient les relations parent-enfant entre les calculs avec des sous-calculs en suspens pour simplifier le processus de synchronisation. De plus, le système d'exécution optimise le cas courant où la fonction actuelle n'a pas de calculs enfants en attente et où tous les travailleurs sont occupés. Les autres fonctionnalités prises en charge incluent les exceptions C++, les hyper-objets réducteurs et les pedigrees.
Cours 14. Mise en cache et algorithmes efficaces en cache
Cours 14. Mise en cache et algorithmes efficaces en cache
Dans la vidéo sur la mise en cache et les algorithmes efficaces en matière de cache, l'instructeur explique la hiérarchie des caches des machines modernes, les différences entre les caches mappés entièrement associatifs et directs, ainsi que les avantages et les inconvénients des caches associatifs définis. La vidéo présente également le modèle de cache idéal et le concept d'algorithmes efficaces en matière de cache. L'orateur discute du lemme d'absence de cache, de l'hypothèse de cache grand et du lemme de mise en cache de la sous-matrice. Ils analysent également les échecs de cache lors de la lecture d'une sous-matrice et lors de la multiplication de la matrice. La vidéo se termine en présentant le concept de multiplication matricielle tuilée et comment elle peut améliorer considérablement les performances, mais note également qu'elle n'est pas portable et peut être coûteuse à optimiser pour plusieurs niveaux de cache.
Le cours couvre la mise en cache et les algorithmes efficaces de mise en cache, en utilisant la multiplication matricielle récursive comme exemple. L'orateur souligne l'importance d'analyser séparément les défauts de travail et de cache et note que les algorithmes prenant en charge le cache peuvent ne pas être optimaux pour toutes les machines en raison de tailles de cache différentes. L'orateur discute également des algorithmes inconscients du cache qui s'ajustent automatiquement pour n'importe quelle taille de cache et mentionne les développements dans le code parallèle oublieux du cache. Enfin, l'objectif est de concevoir des algorithmes qui sont soit conscients du cache, soit inconscients du cache, et la discussion sur la conception d'algorithmes inconscients du cache se poursuivra dans la conférence suivante.
Cours 15. Algorithmes Cache-Oblivious
Cours 15. Algorithmes Cache-Oblivious
La vidéo traite des algorithmes sans mémoire cache, qui peuvent automatiquement régler la taille du cache sur une machine, obtenir une bonne efficacité du cache et ne nécessitent pas de connaître les paramètres de cache de la machine. La vidéo montre comment écrire du code pour simuler la diffusion de la chaleur à travers des équations différentielles en utilisant la méthode du pochoir sur une matrice 2D. Le code a à la fois des versions en boucle et trapézoïdales, cette dernière étant plus efficace en termes de cache mais pas beaucoup plus rapide dans une simulation 2D en raison de la prévisibilité du modèle d'accès du code en boucle. La vidéo aborde également l'interaction entre la mise en cache et le parallélisme et le diagnostic des goulots d'étranglement potentiels d'accélération parallèle. Enfin, l'orateur explique les calculs de stencil et comment chaque point d'un tableau est mis à jour à l'aide d'un modèle fixe appelé stencil, qui peut souffrir de défauts de cache et a des besoins de stockage qui peuvent être réduits à l'aide d'algorithmes efficaces exploitant la localité temporelle et spatiale.
La deuxième partie de la vidéo traite des algorithmes sans mémoire cache pour le tri et la fusion. Plus précisément, la vidéo couvre la complexité du cache du tri par fusion, introduit le concept de fusion multivoie et explique la complexité du cache de l'algorithme de fusion multivoie. La vidéo traite également de l'algorithme de tri en entonnoir, qui est un algorithme de tri sans cache qui peut fusionner K éléments au carré et K listes triées. L'algorithme de tri en entonnoir est optimal et construit de manière récursive avec la racine carrée de K entonnoirs. La vidéo explique qu'il existe de nombreux autres algorithmes et structures de données inconscients du cache, tels que les b-trees, la maintenance ordonnée des fichiers et les files d'attente prioritaires. Dans l'ensemble, la vidéo fournit une introduction aux algorithmes sans cache pour ceux qui souhaitent en savoir plus sur le sujet.
Cours 16. Programmation parallèle non déterministe
Cours 16. Programmation parallèle non déterministe
Cette vidéo aborde divers concepts liés à la programmation parallèle déterministe et non déterministe. L'orateur insiste sur l'importance d'éviter le non-déterminisme car il peut conduire à des comportements anormaux et à un débogage difficile. Les stratégies de gestion du non-déterminisme comprennent l'utilisation de valeurs fixes, la relecture d'enregistrements, des outils d'analyse, l'encapsulation et les tests unitaires. L'utilisation des mutex est explorée en détail, y compris la rotation par rapport à la production, la réentrante par rapport à la non-réentrante et le juste par rapport à l'injuste. L'orateur aborde également le concept de changement de contexte et le "problème de location de ski" dans le cadre de la programmation parallèle. Le segment se termine par une discussion des principes de base de l'ingénierie des performances dans les processeurs multicœurs.
La deuxième partie de la vidéo aborde le problème du blocage en programmation parallèle et propose des solutions pour l'éviter, comme l'ordre linéaire des mutex qui garantit qu'il n'y a pas de cycle d'attente. De plus, l'orateur introduit le concept de mémoire transactionnelle, qui assure l'atomicité en représentant une région critique comme une transaction qui valide toutes les mises à jour en même temps. La vidéo présente ensuite un algorithme qui utilise une approche basée sur le verrouillage avec un tableau de propriété fini et une méthode de tri des versions requises pour éviter les blocages et la famine sans avoir besoin d'un verrou global. Enfin, l'algorithme release sort and reacquire est expliqué, ce qui empêche plusieurs verrous d'essayer d'acquérir un verrou simultanément, évitant ainsi les problèmes de performances.