Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Trabajo_ASD_OMP_MPI/Pruebas_trabajo_cluster.py
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
112 lines (93 sloc)
4.04 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import subprocess | |
import csv | |
import os | |
import time | |
###Constantes### | |
CARPETA_CODIGOS = "./Codigos/" | |
CARPETA_COMPILADOS = "./Compilados/" | |
ARCHIVO_CLUSTER = "cluster.txt" | |
#Hilos a usar en los test omp + mpi | |
OMP_IN_MPI_TESTS = [1,2] | |
#Procesos a usar en los test mpi | |
MPI_TESTS = [1,3,9,12] | |
#Pasos a realizar en cada test | |
STEPS_TESTS = [100000,1000000, 10000000, 10000000] | |
#Numero de veces que se repite el test para sacar media de tiempo | |
N_TESTS = 2 | |
###Definicion de funciones### | |
#Listado de archivos dentro de una carpeta | |
def ls(ruta): | |
return os.listdir(ruta) | |
#Compilado de los archivos especificado | |
def compile(archivos): | |
for archivo in archivos: | |
if "_omp_mpi" in archivo: | |
subprocess.run(['mpicc','-fopenmp', CARPETA_CODIGOS+archivo, '-o', CARPETA_COMPILADOS+archivo.replace(".c","_cmp")]) | |
print("Compilado con MPI y OpenMP de",archivo,"finalizado") | |
elif "mpi" in archivo: | |
subprocess.run(['mpicc', CARPETA_CODIGOS+archivo, '-o', CARPETA_COMPILADOS+archivo.replace(".c","_cmp")]) | |
print("Compilado con MPI de",archivo,"finalizado") | |
#Pruebas para los binarios mpi | |
def test_mpi(bin): | |
resultados = dict() | |
#Obtenemos el path absoluto del binario para ejecutarlo | |
binPath = os.path.abspath(CARPETA_COMPILADOS+bin); | |
for procs in MPI_TESTS: | |
for pasos in STEPS_TESTS: | |
media = 0 | |
for _ in range(N_TESTS): | |
res = subprocess.run(['mpirun', '-np', str(procs), '-hostfile', ARCHIVO_CLUSTER, binPath, str(pasos)], capture_output=True, text=True) | |
print(res.stdout, pasos, procs) | |
media = media + float(res.stdout.split(",")[0]) | |
resultados[(procs, pasos)] = str(media/N_TESTS)+","+res.stdout.split(",")[1] | |
return resultados | |
def test_omp_mpi(bin): | |
resultados = dict() | |
#Obtenemos el path absoluto del binario para ejecutarlo | |
binPath = os.path.abspath(CARPETA_COMPILADOS+bin); | |
for procs in MPI_TESTS: | |
for hilo in OMP_IN_MPI_TESTS: | |
for pasos in STEPS_TESTS: | |
media = 0 | |
for _ in range(N_TESTS): | |
res = subprocess.run(['mpirun', '-np', str(procs), binPath, str(hilo), str(pasos)], capture_output=True, text=True) | |
media = media + float(res.stdout.split(",")[0]) | |
resultados[(hilo, procs, pasos)] = str(media/N_TESTS)+","+res.stdout.split(",")[1] | |
return resultados | |
###Inicio del programa### | |
print("Inicio de las pruebas\n") | |
###Compliacion de los archivos### | |
print("\nIniciando compilacion de archivos\n") | |
archivos = ls(CARPETA_CODIGOS) | |
compilados = ls(CARPETA_COMPILADOS) | |
#Eliminamos los compilados que hay en la carpeta compilados | |
for file in compilados: | |
os.remove(CARPETA_COMPILADOS+file) | |
compile(archivos) | |
print("\nCompilacion de archivos finalizada\n") | |
###Ejecucion de pruebas### | |
print("\nInicio de ejecucion de pruebas\n") | |
binarios = ls(CARPETA_COMPILADOS) | |
with open("./resultados.csv", 'w', newline='') as archivo_csv: | |
writer = csv.writer(archivo_csv) | |
writer.writerow(['Prueba Realizada', 'Tiempo(s)', 'Hilos', 'Procesos', 'Valor calculado', 'Pasos']) | |
#Para cada binario | |
for binario in binarios: | |
print("Testeando",binario) | |
#Lo ejecutamos con el modo requerido | |
#Tratamos la salida generada del test | |
# y la añadimos al csv | |
if "_omp_mpi" in binario: | |
res = test_omp_mpi(binario) | |
for k,v in res.items(): | |
vs = v.split(",") #Valor = time, valor calc y k[0] = hilos, k[1] = procesos k[2] = pasos | |
writer.writerow([binario, vs[0], k[0], k[1], vs[-1], k[2]]) | |
elif "mpi" in binario: | |
res = test_mpi(binario) | |
for k,v in res.items(): | |
vs = v.split(",") #Valor = time, valor calc y k[0] = procesos, k[1] = pasos | |
writer.writerow([binario, vs[0], 0, k[0], vs[-1],k[1]]) | |
#Se añade un segundo de delay para dar tiempo a que se estabilice el sistema despues de cada test | |
time.sleep(1) | |
print("\nFin de ejecucion de pruebas\n") | |
print("Final de las pruebas") |