Skip to content
Permalink
main
Switch branches/tags

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?
Go to file
 
 
Cannot retrieve contributors at this time
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")