Skip to content
Permalink
05fceb0451
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
153 lines (130 sloc) 6.02 KB
import subprocess
import csv
import os
import time
###Constantes###
CARPETA_CODIGOS = "./Codigos/"
CARPETA_COMPILADOS = "./Compilados/"
#Hilos a usar en los test omp
OMP_TESTS = [1,4,8]
#Hilos a usar en los test omp + mpi
OMP_IN_MPI_TESTS = [1,2]
#Procesos a usar en los test mpi
MPI_TESTS = [1,2,4]
#Pasos a realizar en cada test
STEPS_TESTS = [100000, 1000000, 10000000]
#Numero de veces que se repite el test para sacar media de tiempo
N_TESTS = 3
###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','-o2','-fopenmp', CARPETA_CODIGOS+archivo, '-o', CARPETA_COMPILADOS+archivo.replace(".c","_cmp")])
print("Compilado con MPI y OpenMP de",archivo,"finalizado")
elif "seq" in archivo:
subprocess.run(['gcc','-o0', CARPETA_CODIGOS+archivo, '-o', CARPETA_COMPILADOS+archivo.replace(".c","_cmp_o0")])
print("Compilado normal de",archivo,"sin optimizacion finalizado")
subprocess.run(['gcc','-o2', CARPETA_CODIGOS+archivo, '-o', CARPETA_COMPILADOS+archivo.replace(".c","_cmp_o2")])
print("Compilado normal de",archivo,"con optimizacion maxima finalizado")
elif "omp" in archivo:
subprocess.run(['gcc', '-o0', '-fopenmp', CARPETA_CODIGOS+archivo, '-o', CARPETA_COMPILADOS+archivo.replace(".c","_cmp_o0")])
print("Compilado con OpenMP",archivo,"sin optimizacion finalizado")
subprocess.run(['gcc', '-o2', '-fopenmp', CARPETA_CODIGOS+archivo, '-o', CARPETA_COMPILADOS+archivo.replace(".c","_cmp_o2")])
print("Compilado con OpenMP",archivo,"con optimizacion maxima 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 secuencial
def test_sec(bin):
resultados = dict()
for test in STEPS_TESTS:
media = 0
for _ in range(N_TESTS):
res = subprocess.run([CARPETA_COMPILADOS+bin, str(test)], capture_output=True, text=True)
media = media + float(res.stdout.split(",")[0])
resultados[test] = str(media/N_TESTS)+","+res.stdout.split(",")[1]
return resultados
#Pruebas para los binarios omp
def test_omp(bin):
resultados = dict()
for hilos in OMP_TESTS:
for pasos in STEPS_TESTS:
media = 0
for _ in range(N_TESTS):
res = subprocess.run([CARPETA_COMPILADOS+bin, str(hilos), str(pasos)], capture_output=True, text=True)
media = media + float(res.stdout.split(",")[0])
resultados[(hilos,pasos)] = str(media/N_TESTS)+","+res.stdout.split(",")[1]
return resultados
#Pruebas para los binarios mpi
def test_mpi(bin):
resultados = dict()
for procs in MPI_TESTS:
for pasos in STEPS_TESTS:
media = 0
for _ in range(N_TESTS):
res = subprocess.run(['mpirun', '-np', str(procs), CARPETA_COMPILADOS+bin, str(pasos)], capture_output=True, text=True)
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()
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(['mpiexec', '-np', str(procs), CARPETA_COMPILADOS+bin, 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 "seq" in binario:
res = test_sec(binario)
for k,v in res.items():
vs = v.split(",")
writer.writerow([binario, vs[0], 0, 0, vs[-1],k])
elif "omp" in binario:
res = test_omp(binario)
for k,v in res.items():
vs = v.split(",") #Valor = time, valor calc y k[0] = hilos, k[1] = pasos
writer.writerow([binario, vs[0], k[0], 0, vs[-1],k[1]])
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")