2024-04-21 10:19:54 +02:00
|
|
|
\DocumentMetadata{testphase = {phase-II,sec,toc,graphic,minipage,float,text}}
|
2024-03-09 18:22:32 +01:00
|
|
|
\documentclass{article}
|
|
|
|
|
|
|
|
\usepackage[T1]{fontenc} % encoding
|
|
|
|
\renewcommand{\familydefault}{\sfdefault} % sans-serif font
|
|
|
|
|
2024-04-21 10:19:54 +02:00
|
|
|
% Langages
|
|
|
|
\usepackage[french]{babel}
|
2024-03-09 18:22:32 +01:00
|
|
|
\frenchsetup{SmallCapsFigTabCaptions=false}
|
|
|
|
|
2024-03-26 21:08:43 +01:00
|
|
|
% Add \extra info to title
|
2024-03-26 21:01:09 +01:00
|
|
|
\makeatletter
|
|
|
|
\providecommand{\extra}[1]{
|
|
|
|
\apptocmd{\@author}{
|
|
|
|
\end{tabular}
|
2024-03-26 21:08:43 +01:00
|
|
|
\par\vspace*{0.7em}
|
2024-03-26 21:01:09 +01:00
|
|
|
\begin{tabular}[t]{c}
|
|
|
|
#1}{}{}
|
|
|
|
}
|
|
|
|
\makeatother
|
|
|
|
|
2024-04-21 10:19:54 +02:00
|
|
|
% Code integration
|
2024-04-23 13:25:28 +02:00
|
|
|
\usepackage{minted}
|
|
|
|
\setminted[c]{autogobble,frame=lines}
|
|
|
|
\usemintedstyle{emacs}
|
2024-04-21 10:19:54 +02:00
|
|
|
|
2024-04-21 10:04:30 +02:00
|
|
|
\def\titleName{Projet : Un ordonnanceur par work stealing}
|
|
|
|
\def\docTitle{\href{https://www.irif.fr/~jch/enseignement/systeme/projet.pdf}{\titleName}}
|
|
|
|
|
|
|
|
\def\anri{Anri Kennel}
|
2024-04-21 10:19:54 +02:00
|
|
|
\def\authorMail{mailto:anri.kennel@etu.u-paris.fr}
|
2024-04-21 10:04:30 +02:00
|
|
|
\def\docSubject{Programmation système avancée}
|
|
|
|
\def\docLocation{Université Paris Cité}
|
|
|
|
|
|
|
|
\usepackage[
|
|
|
|
pdfauthor={\anri}, % author metadata
|
|
|
|
pdftitle={\titleName}, % title metadata
|
|
|
|
pdfsubject={\docSubject}, % subject metadata
|
|
|
|
hidelinks, % clickable links in table of contents
|
|
|
|
]{hyperref}
|
2024-03-26 21:01:09 +01:00
|
|
|
|
2024-04-21 10:04:30 +02:00
|
|
|
\title{\docTitle}
|
|
|
|
\author{\href{\authorMail}{\anri}\thanks{\anri : 22302653}}
|
|
|
|
\extra{\docSubject~$\cdot$ \docLocation}
|
2024-03-09 18:22:32 +01:00
|
|
|
\date{Année universitaire 2023-2024}
|
|
|
|
|
2024-04-21 11:57:37 +02:00
|
|
|
\newcommand{\docref}[1]{\textit{\nameref{#1}}} % italic nameref
|
|
|
|
|
|
|
|
% Aliases
|
|
|
|
\def\coeurs{c\oe{}urs}
|
|
|
|
|
2024-03-26 21:01:09 +01:00
|
|
|
|
2024-03-09 18:22:32 +01:00
|
|
|
\begin{document}
|
|
|
|
\maketitle
|
2024-04-21 10:19:54 +02:00
|
|
|
\flushbottom
|
2024-03-09 18:22:32 +01:00
|
|
|
\tableofcontents
|
|
|
|
\clearpage
|
|
|
|
|
2024-04-24 02:09:13 +02:00
|
|
|
% TODO: Mandelbrot
|
|
|
|
% TODO: Computer 2
|
|
|
|
|
2024-04-21 11:57:37 +02:00
|
|
|
\section{Descriptions}
|
|
|
|
Description des différents algorithmes implémentés.
|
|
|
|
|
|
|
|
\subsection{Naïf}
|
2024-04-23 13:25:28 +02:00
|
|
|
Cette implémentation naïve correspond au mode \texttt{serial}
|
|
|
|
de \texttt{quicksort.c}. Elle lance les tâches sans threads.
|
2024-04-21 11:57:37 +02:00
|
|
|
|
2024-04-23 13:25:28 +02:00
|
|
|
\subsection[Threads sans gestion]{Threads sans gestion}
|
2024-04-21 11:57:37 +02:00
|
|
|
Cette implémentation correspond à simplement démarrer un nouveau thread
|
|
|
|
pour chaque nouvelle tâche.
|
|
|
|
|
2024-04-23 13:25:28 +02:00
|
|
|
Comme cette implémentation n'ordonnance rien et que le nombre de threads créer
|
|
|
|
est important.
|
|
|
|
|
2024-04-21 11:57:37 +02:00
|
|
|
\subsection{Threads avec pile}\label{desc:th_pile}
|
|
|
|
Pour cette implémentation, on garde en mémoire une pile,
|
|
|
|
et on démarre un nombre fixe de threads et à chaque ajout d'une tâche,
|
|
|
|
on l'empile. Chaque thread récupère la dernière tâche ajoutée à la pile.
|
|
|
|
|
|
|
|
\subsubsection{Sélection aléatoire de tâche}
|
|
|
|
Même fonctionnement que dans l'algorithme de \docref{desc:th_pile}, sauf
|
|
|
|
qu'au lieu de récupérer la dernière tâche, on récupère une tâche
|
|
|
|
aléatoire de la pile.
|
|
|
|
|
2024-04-23 13:25:28 +02:00
|
|
|
\subsection{Répartition par work-stealing}
|
|
|
|
\begin{itemize}
|
2024-04-24 02:09:13 +02:00
|
|
|
\item Au lieu d'avoir une pile unique, chaque thread à sa propre liste
|
|
|
|
\item Chaque tâche est ajouté sur le même thread de sa création.
|
|
|
|
\item Quand un thread n'as pas de tâches à faire, il vole une tâche à un autre
|
|
|
|
thread, en partant de la fin
|
2024-04-23 13:25:28 +02:00
|
|
|
\end{itemize}
|
2024-03-09 18:22:32 +01:00
|
|
|
|
|
|
|
\section{Statistiques}
|
2024-04-21 11:57:37 +02:00
|
|
|
Chaque implémentation a été testée avec l'optimisation de niveau 2
|
2024-04-23 13:25:28 +02:00
|
|
|
de \texttt{gcc}, sur 2 machines.
|
|
|
|
|
|
|
|
Le programme utilisé pour tester les implémentations est le \texttt{quicksort}
|
|
|
|
fourni.
|
|
|
|
|
2024-04-21 11:57:37 +02:00
|
|
|
|
|
|
|
\def\mone{\textit{Machine 1}} % fixe
|
|
|
|
\def\mtwo{\textit{Machine 2}} % portable
|
|
|
|
|
|
|
|
\begin{enumerate}
|
2024-04-24 02:09:13 +02:00
|
|
|
\item \textbf{12 \coeurs} pour la \mone.
|
|
|
|
\item \textbf{8 \coeurs} pour la \mtwo.
|
2024-04-21 11:57:37 +02:00
|
|
|
\end{enumerate}
|
|
|
|
|
|
|
|
\subsection{Naïf}\label{stats:naive}
|
|
|
|
\begin{description}
|
2024-04-24 02:09:13 +02:00
|
|
|
\item[\mone] Le programme a été lancé \textbf{100 fois}.
|
|
|
|
Le temps moyen d'exécution a été de \textbf{0,855 secs}
|
2024-04-24 18:06:50 +02:00
|
|
|
\item[\mtwo] Le programme a été lancé \textbf{100 fois}.
|
|
|
|
Le temps moyen d'exécution a été de \textbf{1,139 secs}
|
2024-04-21 11:57:37 +02:00
|
|
|
\end{description}
|
|
|
|
|
|
|
|
Ce programme ne bénéficie pas de toute la puissance de la machine.
|
|
|
|
|
|
|
|
\subsection{Threads sans gestion}\label{stats:th_ges}
|
|
|
|
\begin{description}
|
2024-04-24 02:09:13 +02:00
|
|
|
\item[\mone] Le programme a été lancé \textbf{10 fois}.
|
|
|
|
Le temps moyen d'exécution a été de \textbf{35,985 secs}
|
2024-04-24 18:06:50 +02:00
|
|
|
\item[\mtwo] Le programme a été lancé \textbf{10 fois}.
|
|
|
|
Le temps moyen d'exécution a été de \textbf{18,854 secs}
|
2024-04-21 11:57:37 +02:00
|
|
|
\end{description}
|
|
|
|
|
|
|
|
La création des threads pour chaque tâche créer un énorme
|
|
|
|
goulot d'étranglement qui réduit de grandement les performances.
|
|
|
|
|
2024-04-23 13:25:28 +02:00
|
|
|
Le temps d'exécution étant long, nous pouvons voir les threads via la commande
|
|
|
|
\texttt{top} : \mintinline{bash}|top -Hp $(pgrep ordonnanceur)|.
|
|
|
|
|
|
|
|
Pour augmenter les performances, il faut avoir une taille fixe de threads créer,
|
|
|
|
et donc il faut gérer les tâches et décider de quelle tâche va sur quel thread.
|
|
|
|
|
|
|
|
\subsection{Threads avec pile}\label{stats:stack}
|
2024-04-21 11:57:37 +02:00
|
|
|
\begin{description}
|
2024-04-24 02:09:13 +02:00
|
|
|
\item[\mone] Le programme a été lancé \textbf{100 fois}.
|
|
|
|
Le temps moyen d'exécution a été de \textbf{0,258 secs}
|
2024-04-24 18:06:50 +02:00
|
|
|
\item[\mtwo] Le programme a été lancé \textbf{100 fois}.
|
|
|
|
Le temps moyen d'exécution a été de \textbf{0,356 secs}
|
2024-04-21 11:57:37 +02:00
|
|
|
\end{description}
|
|
|
|
|
2024-04-23 13:25:28 +02:00
|
|
|
Le lancement de nouveau thread étant limité, les performances
|
2024-04-21 11:57:37 +02:00
|
|
|
sont grandement améliorées par rapport aux tests de \docref{stats:th_ges}.
|
|
|
|
|
|
|
|
Également grâce au fait que désormais on utilise les \coeurs~de notre CPU,
|
|
|
|
les performances sont aussi améliorées par rapport aux tests de
|
|
|
|
\docref{stats:naive}.
|
|
|
|
|
|
|
|
\subsubsection{Sélection aléatoire de tâche}
|
|
|
|
\begin{description}
|
2024-04-24 02:09:13 +02:00
|
|
|
\item[\mone] Le programme a été lancé \textbf{100 fois}.
|
|
|
|
Le temps moyen d'exécution a été de \textbf{0,390 secs}
|
2024-04-24 18:06:50 +02:00
|
|
|
\item[\mtwo] Le programme a été lancé \textbf{100 fois}.
|
|
|
|
Le temps moyen d'exécution a été de \textbf{0,438 secs}
|
2024-04-21 11:57:37 +02:00
|
|
|
\end{description}
|
|
|
|
|
2024-04-23 13:25:28 +02:00
|
|
|
Cette implémentation est identique à \docref{stats:stack}, à l'exception que
|
|
|
|
l'on récupère une tâche aléatoire de la pile au lieu d'y prendre la dernière
|
|
|
|
ajouté.
|
|
|
|
|
|
|
|
Cette façon de faire réduit les performances.
|
2024-04-21 11:57:37 +02:00
|
|
|
|
2024-04-23 13:25:28 +02:00
|
|
|
\subsection{Répartition par work-stealing}
|
2024-04-21 11:57:37 +02:00
|
|
|
\begin{description}
|
2024-04-24 02:09:13 +02:00
|
|
|
\item[\mone] Le programme a été lancé \textbf{100 fois}.
|
|
|
|
Le temps moyen d'exécution a été de \textbf{0,229 secs}
|
2024-04-24 18:06:50 +02:00
|
|
|
\item[\mtwo] Le programme a été lancé \textbf{100 fois}.
|
|
|
|
Le temps moyen d'exécution a été de \textbf{0,397 secs}
|
2024-04-21 11:57:37 +02:00
|
|
|
\end{description}
|
|
|
|
|
2024-04-24 17:16:34 +02:00
|
|
|
Dans cet implémentation, on n'utilises plus une pile mais un deque de tâches.
|
2024-04-23 13:25:28 +02:00
|
|
|
Cette façon de faire est légèrement meilleur que \docref{desc:th_pile}.
|
2024-03-09 18:22:32 +01:00
|
|
|
|
|
|
|
\end{document}
|