This commit is contained in:
higepi 2022-12-22 19:38:33 +01:00
commit bcdc18f37a

280
T1/TP/TP1/cacti_7/_script.py Executable file → Normal file
View file

@ -5,49 +5,273 @@ Ceci est un script permettant de tester différentes configurations
de cache pour cacti de cache pour cacti
""" """
import os import subprocess
import matplotlib.pyplot as plt
import numpy as np
chemin_fichier_config = "_fichiers/configs/" global nom_fichier_config
chemin_fichier_result = "_fichiers/resultats/" global chemin_fichier_config
configurations = [[1,0,0,0],[1,0,1,1],[1,0,0,1],[1,1,1,1]]
nom_fichier_config = "cache.cfg" nom_fichier_config = "cache.cfg"
chemin_fichier_config = ""
i = 0 i = 0
#----------- Cette section permet de configurer le nombre de ports entrée/sortie du fichier --------- def lancer_simu():
with open(chemin_fichier_config + nom_fichier_config, "r") as fichier: # Cette fonctionn permet de lancer la simulation et de récupérer les résultats
Lignes = fichier.readlines() global chemin_fichier_config
index = 0 global nom_fichier_config
resultat = subprocess.run(['./cacti', '-infile', chemin_fichier_config + nom_fichier_config ], stdout=subprocess.PIPE)
for ligne in Lignes: resultat = str(resultat.stdout)
if "<configs_ports>" in ligne: resultat = resultat.split("\\n")
Lignes[index + 1] = "-read-write port {}\n".format(configurations[i][0]) return resultat
Lignes[index + 2] = "-exclusive read port {}\n".format(configurations[i][1])
Lignes[index + 3] = "-exclusive write port {}\n".format(configurations[i][2])
Lignes[index + 4] = "-single ended read ports {}\n".format(configurations[i][3])
break
index += 1
with open(chemin_fichier_config + nom_fichier_config, "w") as fichier: def parser_elements(resultat):
fichier.writelines(Lignes) # Cette fonction permet de parser les résultats
val_tps = 0
val_energie = 0
val_aire = 0
for ligne in resultat:
if "Access time (ns):" in ligne:
val_tps = float(ligne.split(':')[1])
if "Total dynamic read energy per access (nJ):" in ligne:
val_energie = float(ligne.split(':')[1])
if "Cache height x width (mm):" in ligne:
string_aire = ligne.split(':')[1]
hauteur = float(string_aire.split('x')[0])
largeur = float(string_aire.split('x')[1])
val_aire = hauteur*largeur
return [val_tps, val_energie, val_aire]
#---------------- Fonctions pour simuler selon la taille du cache et l'associativité --------------------
def config_taille_associativite(config):
#----------- Cette section permet de configurer le nombre de ports entrée/sortie du fichier ---------
global chemin_fichier_config
global nom_fichier_config
with open(chemin_fichier_config + nom_fichier_config, "r") as fichier:
Lignes = fichier.readlines()
index = 0
lignes_configurees = 0
for ligne in Lignes:
if "<configs_taille_cache>" in ligne:
Lignes[index + 1] = "-size (bytes) {}\n".format(config[0])
lignes_configurees += 1
if "<configs_associativite>" in ligne:
Lignes[index + 1] = "-associativity {}\n".format(config[1])
lignes_configurees += 1
if lignes_configurees == len(config):
break
index += 1
with open(chemin_fichier_config + nom_fichier_config, "w") as fichier:
fichier.writelines(Lignes)
def simulation_taille_associativite(configurations_taille,configurations_associativite):
liste_valeurs_taille = []
liste_valeurs_associativite = []
#--------- Faire tourner les simulations -------
for conf in configurations_taille:
config_taille_associativite(conf)
liste_valeurs_taille.append(parser_elements(lancer_simu()))
for conf in configurations_associativite:
config_taille_associativite(conf)
liste_valeurs_associativite.append(parser_elements(lancer_simu()))
#------------------- Faire l'affichage -------------------------
liste_valeurs_taille = np.array(liste_valeurs_taille)
liste_valeurs_associativite = np.array(liste_valeurs_associativite)
fig, ax = plt.subplots(1, 3, figsize=(20, 5))
ax2 = [0,0,0]
ax[0].plot(configurations_taille[:,0], liste_valeurs_taille[:,0], 'o-')
ax[0].set_xlabel("Taille (octets)")
ax[0].set_ylabel("Temps d'accès (ns)")
ax2[0] = ax[0].twiny()
ax2[0].plot(configurations_associativite[:,1], liste_valeurs_associativite[:,0], 'o-', color='red')
ax2[0].set_xlabel("Associativité")
ax[0].set_title("Étude sur le temps d'accès")
ax[0].legend(["Taille (octets)"], loc='best')
ax2[0].legend(["Associativité"], loc='best')
ax[1].plot(configurations_taille[:,0], liste_valeurs_taille[:,1], 'o-')
ax[1].set_xlabel("Taille (octets)")
ax[1].set_ylabel("Energie (read) (nJ)")
ax2[1] = ax[1].twiny()
ax2[1].plot(configurations_associativite[:,1], liste_valeurs_associativite[:,1], 'o-', color='red')
ax2[1].set_xlabel("Associativité")
ax[1].set_title("Étude sur la consommation")
ax[1].legend(["Taille (octets)"], loc='best')
ax2[1].legend(["Associativité"], loc='best')
ax[2].plot(configurations_taille[:,0], liste_valeurs_taille[:,2], 'o-')
ax[2].set_xlabel("Taille (octets)")
ax[2].set_ylabel("Aire (mm²)")
ax2[2] = ax[2].twiny()
ax2[2].plot(configurations_associativite[:,1], liste_valeurs_associativite[:,0], 'o-', color='red')
ax2[2].set_xlabel("Associativite")
ax[2].set_title("Étude sur l'aire du cache")
ax[2].legend(["Taille (octets)"], loc='best')
ax2[2].legend(["Associativite"], loc='best')
fig.show()
#------------------- Fonctions pour simuler selon les entrées et sorties du cache ------------------------
def config_entrees_sortie(config):
#----------- Cette section permet de configurer le nombre de ports entrée/sortie du fichier ---------
global chemin_fichier_config
global nom_fichier_config
with open(chemin_fichier_config + nom_fichier_config, "r") as fichier:
Lignes = fichier.readlines()
index = 0
for ligne in Lignes:
if "<configs_ports>" in ligne:
Lignes[index + 1] = "-read-write port {}\n".format(config[0])
Lignes[index + 2] = "-exclusive read port {}\n".format(config[1])
Lignes[index + 3] = "-exclusive write port {}\n".format(config[2])
Lignes[index + 4] = "-single ended read ports {}\n".format(config[3])
break
index += 1
with open(chemin_fichier_config + nom_fichier_config, "w") as fichier:
fichier.writelines(Lignes)
def simulation_entrees_sorties(configurations_read,configurations_write,configurations_readwrite):
liste_valeurs_read = []
liste_valeurs_write = []
liste_valeurs_readwrite = []
#--------- Faire tourner les simulations -------
for conf in configurations_read:
config_entrees_sortie(conf)
liste_valeurs_read.append(parser_elements(lancer_simu()))
for conf in configurations_write:
config_entrees_sortie(conf)
liste_valeurs_write.append(parser_elements(lancer_simu()))
for conf in configurations_readwrite:
config_entrees_sortie(conf)
liste_valeurs_readwrite.append(parser_elements(lancer_simu()))
#------------------- Faire l'affichage -------------------------
liste_valeurs_read = np.array(liste_valeurs_read)
liste_valeurs_write = np.array(liste_valeurs_write)
liste_valeurs_readwrite = np.array(liste_valeurs_readwrite)
liste_val_tps = [liste_valeurs_read[:,0], liste_valeurs_write[:,0], liste_valeurs_readwrite[:,0]]
liste_val_energie = [liste_valeurs_read[:,1], liste_valeurs_write[:,1], liste_valeurs_readwrite[:,1]]
liste_val_aire = [liste_valeurs_read[:,2], liste_valeurs_write[:,2], liste_valeurs_readwrite[:,2]]
fig, ax = plt.subplots(1, 3, figsize=(20, 5))
ax[0].plot(configurations_read[:,0], np.transpose(liste_val_tps), 'o-')
ax[0].set_xlabel("Nombre de ports")
ax[0].set_ylabel("Temps d'accès (ns)")
ax[0].set_title("Étude de l'impact des prots du cache sur le temps d'accès")
ax[0].legend(["Ports d'entrée", 'Ports de sortie', "Ports d'entrée/sortie"], loc='best')
ax[1].plot(configurations_read[:,0], np.transpose(liste_val_energie), 'o-')
ax[1].set_xlabel("Nombre de ports")
ax[1].set_ylabel("Energie (read) (nJ)")
ax[1].set_title("Étude de l'impact des prots du cache sur la consommation")
ax[1].legend(["Ports d'entrée", 'Ports de sortie', "Ports d'entrée/sortie"], loc='best')
ax[2].plot(configurations_read[:,0], np.transpose(liste_val_aire), 'o-')
ax[2].set_xlabel("Nombre de ports")
ax[2].set_ylabel("Aire (mm²)")
ax[2].set_title("Étude de l'impact des prots du cache sur l'aire du cache")
ax[2].legend(["Ports d'entrée", 'Ports de sortie', "Ports d'entrée/sortie"], loc='best')
fig.show()
#---------------- Fonctions pour simuler selon le mode d'accès --------------------
def config_mode_acces(config):
#----------- Cette section permet de configurer le nombre de ports entrée/sortie du fichier ---------
global chemin_fichier_config
global nom_fichier_config
with open(chemin_fichier_config + nom_fichier_config, "r") as fichier:
Lignes = fichier.readlines()
index = 0
for ligne in Lignes:
if "<mode_acces>" in ligne:
Lignes[index + 1] = '-access mode (normal, sequential, fast) - "{}"\n'.format(config)
break
index += 1
with open(chemin_fichier_config + nom_fichier_config, "w") as fichier:
fichier.writelines(Lignes)
def simulation_mode_acces(configurations_mode):
liste_valeurs_mode = []
#--------- Faire tourner les simulations -------
for conf in configurations_mode:
config_mode_acces(conf)
liste_valeurs_mode.append(parser_elements(lancer_simu()))
#------------------- Faire l'affichage -------------------------
liste_valeurs_mode = np.array(liste_valeurs_mode)
fig, ax = plt.subplots(1, 3, figsize=(20, 5))
ax[0].plot(configurations_mode, liste_valeurs_mode[:,0], 'o-')
ax[0].set_xlabel("Mode d'accès")
ax[0].set_ylabel("Temps d'accès (ns)")
ax[0].set_title("Étude sur le temps d'accès")
ax[1].plot(configurations_mode, liste_valeurs_mode[:,1], 'o-')
ax[1].set_xlabel("Mode d'accès")
ax[1].set_ylabel("Energie (read) (nJ)")
ax[1].set_title("Étude sur la consommation")
ax[2].plot(configurations_mode, liste_valeurs_mode[:,2], 'o-')
ax[2].set_xlabel("Mode d'accès")
ax[2].set_ylabel("Aire (mm²)")
ax[2].set_title("Étude sur l'aire du cache")
fig.show()
#----------- Section pour lancer la simulation sur cacti ------------------------------- # #----------Pour lancer la simulation selon la taille et l'associativite -------
# #configurations_taille = np.array([[2048,2],[4096,2],[32768,2],[131072,2],[262144,2], [1048576,2], [2097152,2], [4194304,2],[1073741824,2]])
# #Génération automatique
# valeur = 1024
# configurations_taille = []
# for i in range(11,30):
# valeur = valeur * 2
# configurations_taille.append([valeur,2])
commande = "./cacti -infile {}".format(chemin_fichier_config + nom_fichier_config) # configurations_taille = np.array(configurations_taille)
flux = os.popen(commande) # configurations_associativite = np.array([[4096,2],[4096,4],[4096,8],[4096,16]])
resultat = flux.read().split('\n')
for ligne in resultat: # simulation_taille_associativite(configurations_taille,configurations_associativite)
if "Access time (ns):" in ligne:
val_tps = float(ligne.split(':')[1])
print(val_tps)
##----------Pour lancer la simulation selon les entrées et sorties -------
# configurations_read = np.array([[1,0,0,0],[2,0,0,0],[3,0,0,0],[4,0,0,0]])
# configurations_write = np.array([[0,1,0,0],[0,2,0,0],[0,3,0,0],[0,4,0,0]])
# configurations_readwrite = np.array([[0,0,1,0],[0,0,2,0],[0,0,3,0],[0,0,4,0]])
# simulation_entrees_sorties(configurations_read,configurations_write,configurations_readwrite)
#flux = os.popen(commande) #flux = os.popen(commande)
#print(flux.read()) #print(flux.read())
#----------- Pour lancer la simulation selon les modes d'accès au cache --------
configurations_mode = ["normal","sequential","fast"]
simulation_mode_acces(configurations_mode)