Software engineering project

LINGI2255  2018-2019  Louvain-la-Neuve

Software engineering project
6.0 crédits
30.0 h + 30.0 h
1q

Enseignants
Mens Kim;
Langue
d'enseignement
Anglais
Préalables
  • Introduction à l'algorithmique (LINFO1103)
  • Informatique 2 (LFSAB1402)
  • Computer language concepts ( LINFO1131

 

Thèmes abordés
  • Objets mémoire partagés et synchronisation
  • Performances et évolutivité
  • Support matériel pour la synchronisation
  • Cohérence et progrès
  • Structures de données partagées sans obstruction, sans attente et sans verrouillage
  • Recherche, tri et comptage avec plusieurs c'urs
  • NUMA (Non-Uniform Memory Access) et impact sur les performances
  • Exécution optimiste et mémoire transactionnelle
Acquis
d'apprentissage

Eu égard au référentiel AA du programme « Master ingénieur civil en informatique », ce cours contribue au développement, à l'acquisition et à l'évaluation des acquis d'apprentissage suivants :

  • INFO2.1-5
  • INFO4.1-4
  • INFO5.1-6
  • INFO6.1, INFO6.4

Eu égard au référentiel AA du programme « Master [120] en sciences informatiques », ce cours contribue au développement, à l'acquisition et à l'évaluation des acquis d'apprentissage suivants :

  • INFO2.1-4
  • INFO4.1-4
  • INFO5.1-3
  • INFO6.2-4

Eu égard au référentiel AA du programme « Master [60] en sciences informatiques », ce cours contribue au développement, à l'acquisition et à l'évaluation des acquis d'apprentissage suivants :

  • 1SINF1.M3
  • 1SINF2.1-4
  • 1SINF3.1-4
  • 1SINF4.1-3
  • 1SINF5.2-4

A l'issue de ce cours, les étudiants auront appris à développer un produit logiciel de grande taille dans des conditions semi-professionnelles.  Les étudiants ayant suivi ce cours avec fruit seront capables de :

  • Décrire les différences entre plusieurs modèles de développement majeurs (par exemple, cascade, itératif et agile);
  • Distinguer entre les phases de développement de logiciels (spécifications, architecture, conception, implémentation, validation, documentation);
  • Réaliser, d'une manière rigoureuse et systématique, les artefacts produits dans ces différentes phases du cycle de vie du logiciel;
  • Appliquer une méthodologie de développement logiciel actuellement pratiquée dans l'industrie;
  • Travailler efficacement dans une équipe pour développer un système logiciel de taille moyenne à grande;
  • Gérer la coordination et la communication entre les différents membres de l'équipe;
  • Interagir avec un client pour identifier ses besoins, pour clarifier les spécifications imprécises, et de prendre en compte la demande des modifications tout au long du processus de développement;
  • Décrire les exigences fonctionnelles d'un système logiciel en utilisant, par exemple, les cas d'utilisation ou utilisateurs des histoires;
  • Estimer le temps et les ressources nécessaires pour compléter un tel projet de développement de logiciels, planifier les tâches à exécuter et les délivrables à produire, et assurer le respect de cette planification;
  • Utilisez un outil de gestion de projet pour affecter le suivi les tâches de développement logiciel;
  • Mettre en pratique différentes méthodes et techniques pour assurer la qualité du logiciel produit;
  • Comprendre les problèmes inhérents au développement de grands systèmes logiciels impliquant différentes parties prenantes et qui se composent de plusieurs composants.

La contribution de cette UE au développement et à la maîtrise des compétences et acquis du (des) programme(s) est accessible à la fin de cette fiche, dans la partie « Programmes/formations proposant cette unité d’enseignement (UE) ».

Contenu

Pendant longtemps, les CPU à usage général se sont concentrés sur la prise en charge efficace d'un seul thread d'exécution. Des améliorations dans la fabrication des puces ont permis d'empaqueter plus de transistors sur la même surface d'une plaquette de silicium, et de faire fonctionner des processeurs résultants à des fréquences plus élevées. Les applications monothread s'exécuteraient simplement plus rapidement avec chaque nouvelle génération de processeur. Cette ère est maintenant terminée. L'industrie a connu plusieurs limitations connues sous le nom de mur de puissance, de mur de mémoire et de mur d'ILP. Les fabricants de puces ne sont plus en mesure d'augmenter verticalement les processeurs prenant en charge un seul thread d'exécution, ils ont commencé à regrouper plusieurs unités d'exécution plus simples, ou coeurs. L'exploitation de la puissance de plusieurs c'urs nécessite l'exploitation du parallélisme dans les applications utilisant plusieurs threads. L'écriture de code concurrent nécessite l'identification et la gestion de la concurrence, et l'introduction de la synchronisation nécessaire pour l'exactitude. L'écriture de code concurrent évolutif et performant nécessite de comprendre ce compromis entre la synchronisation et le parallélisme et de maîtriser des implémentations efficaces de structures de données partagées et d'algorithmes pour une exécution simultanée. Enfin, les processeurs multic'urs emploient une disposition de mémoire complexe, et l'hypothèse de temps d'accès mémoire uniformes n'est plus valide. Comprendre l'impact des accès mémoire non uniformes (NUMA) est donc important pour écrire du code efficace pour les processeurs multic'urs.

Ce cours fournira aux étudiants les outils et les connaissances nécessaires pour écrire un code efficace et évolutif pour les processeurs multic'urs modernes. Il détaillera les mécanismes disponibles pour la synchronisation, depuis l'implémentation de constructions de langage telles que verrous, moniteurs ou variables de condition, aux utilisations directes des primitives de synchronisation fournies par le CPU (par exemple compare-and-swap) pour construire des structures de données efficaces et évolutives . Il mettra l'accent sur les aspects de performance de la programmation multicoeur: l'impact des primitives de synchronisation, l'impact de l'accès à la mémoire non uniforme et l'impact des hiérarchies de mémoire à plusieurs niveaux. Il offrira enfin une ouverture vers l'avenir de la programmation multicoeur avec une introduction à la mémoire transactionnelle et au support de l'exécution spéculative dans les CPU modernes (par exemple Intel Haswell), et discutera du modèle d'exécution du code concurrent s'exécutant sur les GPU.

Méthodes d'enseignement
  • Cours et exercices
  • Séances pratiques, notées
  • Examen final
Modes d'évaluation
des acquis des étudiants
  • Projets (40% de la note finale)
  • Examen (60% de la note finale)
Autres infos
  • Algorithms and data structures (LINFO1103 & LINFO1121)
  • Informatique 2 (LFSAB1402)
  • Language constructs for concurrent programming (LINFO1131)
Bibliographie

Obligatoire

  • Slides fournis en classe et en ligne (Moodle)
  • Exercices sur Moodle
  • Questionnaire d'auto-évaluation hebdomadaire sur Moodle

Optionnel

  • The Art of Multiprocessor Programming, Maurice Herlihy and Nir Shavit, Morgan Kaufmann. ISBN 978-0-12-370591-4. UCL library reference 10.620.426
  • Documents de recherche (pour la partie NUMA)
Faculté ou entité
en charge


Programmes / formations proposant cette unité d'enseignement (UE)

Intitulé du programme
Sigle
Crédits
Prérequis
Acquis
d'apprentissage
Master [120] : ingénieur civil en informatique
6
-

Master [60] en sciences informatiques
6
-

Master [120] en sciences informatiques
6
-