Vous êtes sur la page 1sur 3

Questionnaire TP AOD à compléter et rendre sur teide

Binôme (NOM1 Prénom1 – NOM2 Prénom2 ) : BAJDADI YAHYA - TIFAF MOHAMED

Préambule 1 point . Pourquoi le programme récursif avec mémoisation fourni génère-t-il une erreur d’exécution sur
test 5 ?
distanceEdition-recmemo GCA_024498555.1_ASM2449855v1_genomic.fna 77328790 20236404 \
GCF_000001735.4_TAIR10.1_genomic.fna 30808129 19944517
Réponse: Lors de l’execution du test5, le programme demande beaucoup trop de ressources que disponibles. En l’occurence
la mémoire qui doit allouer une matrice beaucoup trop grande en plus du surcoût de récursivité.

1 Programme itératif (4 points)


Expliquer très brièvement (2 à 5 lignes max) le principe de votre code, la mémoire utilisée, le sens de parcours des tableaux.

Nous avons remarqué que pour calculer une des valeurs de ϕ(i, j), nous n’avons besoin que d’au plus 3 valeurs, en
l’occurrence: ϕ(i+1, j), ϕ(i, j+1) et/ou ϕ(i+1, j+1). Nous pouvons donc n’utiliser qu’un seul tableau de taille N+1
représentant la dernière ligne traitée au lieu d’une matrice de taille (M+1, N+1) en sauvegardant la valeur de ϕ(i, j+1)
ou ϕ(i+1, j+1) (selon le besoin imposé par la position) avant de l’écraser durant le traitement. Nous parcourons le dit
tableau M+1 fois dans le sens du stockage.

Analyse du coût théorique de ce programme en fonction de N et M en notation Θ(...)


1. place mémoire allouée (ne pas compter les 2 séquences X et Y en mémoire via mmap) : Θ(N )
2. travail (nombre d’opérations) : Θ(N × M )

3. nombre de défauts de cache obligatoires (sur modèle CO, y compris sur X et Y ) : Θ( N


L)

4. nombre de défauts de cache si Z ≪ min(N, M ) : Θ( N ×M


L )

2 Programme cache aware (4 points)


Expliquer très brièvement (2 à 5 lignes max) le principe de votre code, la mémoire utilisée, le sens de parcours des tableaux.

En se basant sur l’esprit de l’algortihme de parcours √itératif, et afin de minimiser les défauts de cache, nous avons choisit
de diviser le calcule sur des blocs de tailles au plus Z qui a donné le moindre de défauts de cache. Nous avons donc
choisit d’effectuer le blocking verticalement pour parcourir toute les lignes dans le sens du parcours, en sauvegardant cette
fois-ci les valeurs dont on aura besoin durant le prochain bloc dans un nouveau tableau de taille M.

Analyse du coût théorique de ce programme en fonction de N et M en notation Θ(...) )



1. place mémoire (ne pas compter les 2 séquences initiales X et Y en mémoire via mmap) : Θ(M + Z)
2. travail (nombre d’opérations) : Θ(N × M )

3. nombre de défauts de cache obligatoires (sur modèle CO, y compris sur X et Y ) : Θ( N +L Z
)
N ×M
4. nombre de défauts de cache si Z ≪ min(N, M ) : Θ( L× √ )
Z
3 Programme cache oblivious (2 points)
Expliquer très brièvement (2 à 5 lignes max) le principe de votre code, la mémoire utilisée, le sens de parcours des tableaux.

L’algorithme est similaire à celui utiliser pour le cache aware à un seuil près qui est choisit pour donner le moindre de
défauts de caches.
√ Les deux algorithmes effectuent en effet les mêmes parcours (dans le sens de stockage) par contre le
tableau de taille Z est remplacé par un tableau de taille seuil. Il faut faire attention au choix de ce seuil car la récursivité
entraı̂ne un surcoût.

Analyse du coût théorique de ce programme en fonction de N et M en notation Θ(...) )


1. place mémoire (ne pas compter les 2 séquences initiales X et Y en mémoire via mmap) : Θ(M + seuil)
2. travail (nombre d’opérations) : Θ(N × M )
3. nombre de défauts de cache obligatoires (sur modèle CO, y compris sur X et Y ) : Θ( N +seuil
L )
N ×M
4. nombre de défauts de cache si Z ≪ min(N, M ) : Θ( L×seuil )

4 Expérimentation (10 points)


Description de la machine d’expérimentation:
Processeur: 11th Gen Intel® Core™ i3-1115G4 @ 3.00GHz × 4 – Mémoire: 7.5 GiB – Système: Ubuntu 20.04.5 LTS

4.1 (6 points) Avec valgrind --tool =cachegrind --D1=4096,4,64


distanceEdition ba52_recent_omicron.fasta 153 N wuhan_hu_1.fasta 116 M

en prenant pour N et M les valeurs dans le tableau ci-dessous.


Les paramètres du cache LL de second niveau est : 6291456 B, 64 B, 12-way associative
Le tableau ci-dessous est un exemple, complété avec vos résultats et ensuite analysé.
récursif mémo itératif
N M #Irefs #Drefs #D1miss #Irefs #Drefs #D1miss
1000 1000 217,211,784 122,129,004 4,945,259 131,576,343 58,578,876 152,777
2000 1000 433,389,178 243,408,236 11,058,531 263,744,094 117,874,842 298,748
4000 1000 867,161,276 487,372,492 23,290,142 527,426,146 235,563,996 590,722
2000 2000 867,152,874 487,895,187 19,972,864 525,548,590 525,548,590 525,548,590
4000 4000 3,465,875,587 1,950,555,382 80,316,515 2,101,408,370 935,792,079 2,316,443
6000 6000 7,796,336,049 4,387,991,193 180,936,350 4,727,828,005 2,105,400,980 2,105,400,980
8000 8000 13,857,965,596 7,799,954,764 322,644,309 8,404,852,785 8,404,852,785 8,404,852,785
cache aware cache oblivious
N M #Irefs #Drefs #D1miss #Irefs #Drefs #D1miss
1000 1000 127,382,932 57,502,539 13,725 127,383,428 57,503,090 9,816
2000 1000 255,362,019 115,724,250 20,427 255,362,515 115,724,801 12,365
4000 1000 510,666,675 231,264,892 17,616 510,667,171 231,265,443 17,623
2000 2000 508,812,541 229,732,922 33,593 508,813,911 229,734,149 23,466
4000 4000 2,034,394,301 918,575,644 45,620 2,034,541,855 918,658,397 133,814
6000 6000 4,576,994,249 2,066,625,195 237,270 4,584,360,132 2,070,716,394 122,202
8000 8000 8,136,657,704 3,673,977,519 161,261 8,137,528,332 3,674,462,856 159,571

Analyse expérimetale: commenter les mesures expérimentales par rapport aux coûts théoriques précédents. Quel
algotithme se comporte le mieux avec valgrind et les paramètres proposés, pourquoi ?

4.2 (3 points) Sans valgrind, par exécution de la commande :


distanceEdition GCA 024498555.1 ASM2449855v1 genomic.fna 77328790 M
GCF 000001735.4 TAIR10.1 genomic.fna 30808129 N
On mesure le temps écoulé, le temps CPU et l’énergie consommée avec : [présicer ici comment vous avez fait la
mesure: time ou /usr/bin/time ou getimeofday ou getrusage ou perfstart/perfstop and display1 ou...
L’énergie consommée sur le processeur peut être estimée en regardant le compteur RAPL d’énergie (en microJoule)
pour chaque core avant et après l’exécution et en faisant la différence. Le compteur du core K est dans le fichier
/sys/class/powercap/intel-rapl/intel-rapl:K/energy_uj .
1 cf /matieres/4MMAOD6/2022-10-TP-AOD-ADN-Docs-fournis/tp-ADN-distance/srcperf/0-LisezMoi
Par exemple, pour le cœur 0: /sys/class/powercap/intel-rapl/intel-rapl:0/energy_uj Les fonctions fournies
perfstart/perfstop and display dans le répertoire /matieres/4MMAOD6/2022-10-TP-AOD-ADN-Docs-fournis/tp-ADN-distance/
font ces mesures de temps cpu, ecoulé et énergie.
Nota bene: pour avoir un résultat fiable/reproductible (si variailité), il est préférable de faire chaque mesure 5 sois et
de reporter l’intervalle de confiance [min, moyenne, max].
itératif
N M temps temps energie
cpu en s ×10−5 écoulé en s en kWh ×10−6
10000 10000 [mi : 3, 1, me : 5, 7, ma : 11, 8] [mi : 1, 104, me : 1, 105, ma : 1, 109] [mi : 4, 09, me : 4, 13, ma : 4, 15]
20000 20000 [mi : 3, 0, me : 4, 5, ma : 7, 4] [mi : 4, 44, me : 4, 48, ma : 4, 51] [mi : 17, 115, me : 17, 474, ma : 17, 753]
30000 30000 [mi : 4, 9, me : 6, 5, ma : 9, 0] [mi : 10, 04, me : 10, 49, ma : 11, 15] [mi : 37, 72, me : 42, 62, ma : 50, 84]
40000 40000 [mi : 3, 3, me : 8, 92, ma : 15, 3] [mi : 17, 87, me : 17, 91, ma : 17, 97] [mi : 66, 47, me : 67, 99, ma : 70, 17]
cache aware
N M temps temps energie
cpu en s ×10−5 écoulé en s en kWh ×10−6
10000 10000 [mi : 3, 5, me : 7, 3, ma : 12, 2] [mi : 0, 940, me : 0, 947, ma : 0, 951] [mi : 3, 46, me : 3, 56, ma : 3, 77]
20000 20000 [mi : 3, 2, me : 6, 8, ma : 13, 2] [mi : 3, 78, me : 3, 8, ma : 3, 86] [mi : 14, 5, me : 14, 7, ma : 14, 95]
30000 30000 [mi : 3, me : 7, 3, ma : 11, 1] [mi : 8, 64, me : 8, 68, ma : 8, 74] [mi : 32, 9, me : 33, 3, ma : 33, 6]
40000 40000 [mi : 3, 6, me : 7, 5, ma : 12, 2] [mi : 15, 3, me : 15, 5, ma : 15, 7] [mi : 58, 17, me : 59, 11, ma : 59, 78]
cache oblivious
N M temps temps energie
cpu en s ×10−5 écoulé en s en kWh ×10−6
10000 10000 [mi : 3, 90me : 8, 84, ma : 14, 20] [mi : 0, 932, me : 0, 939, ma : 0, 947] [mi : 3, 3, me : 3, 6, ma : 3, 7]
20000 20000 [mi : 3, 30me : 8, 94, ma : 16, 10] [mi : 3, 74, me : 3, 75, ma : 3, 77] [mi : 13, 70, me : 14, 07, ma : 14, 50]
30000 30000 [mi : 4, 50me : 8, 02, ma : 12, 3] [mi : 8, 43, me : 8, 50, ma : 8, 55] [mi : 31, 7, me : 32, 2, ma : 32, 5]
40000 40000 [mi : 3, 8, me : 7, 7, ma : 11, 9] [mi : 15, 0, me : 15, 2, ma : 15, 3] [mi : 57, 1, me : 57, 7, ma : 58, 5]

4.3 (1 point) Extrapolation: estimation de la durée et de l’énergie pour la commande :


distanceEdition GCA 024498555.1 ASM2449855v1 genomic.fna 77328790 20236404
GCF 000001735.4 TAIR10.1 genomic.fna 30808129 19944517
A partir des résultats précédents, le programme cache oblivious est le plus performant pour la commande ci dessus
(test 5); les ressources pour l’execution seraient: en utilisant la méthode d’interpolation polinomiale de Lagrange sur les
valeurs données par l’algorithme cache-oblivious en estimant M=N et ne s’interessant qu’au cas d’une fonction univariée
donne:
• Temps cpu (en s) : 6.63 × 10−3

• Energie (en kWh) : 36215 × 10−6


Question subsidiaire: comment feriez-vous pour avoir un programme s’exécutant en moins de 1 minute ? donner le
principe en moins d’une ligne, même 1 mot précis suffit! Branch And Bound

Vous aimerez peut-être aussi