Files
triton/autotune/python/optimize.py
2014-09-11 16:14:26 -04:00

63 lines
2.4 KiB
Python

import array
import numpy as np
import random
import itertools
import tools
import deap.tools
from deap import base
from deap import creator
from genetic import GeneticOperators
from genetic import eaMuPlusLambda
def exhaustive(statement, context, TemplateType, build_template, parameter_names, all_parameters, compute_perf, perf_metric, out):
device = context.devices[0]
nvalid = 0
current = 0
minT = float('inf')
for individual in itertools.product(*all_parameters):
template = build_template(TemplateType.Parameters(*individual))
if not tools.skip(template, statement, device):
nvalid = nvalid + 1
for individual in itertools.product(*all_parameters):
template = build_template(TemplateType.Parameters(*individual))
try:
T = tools.benchmark(template,statement,device)
current = current + 1
if T < minT:
minT = T
best = individual
print '%d / %d , Best is %d %s for %s\r'%(current, nvalid, compute_perf(minT), perf_metric, best)
except:
pass
def genetic(statement, context, TemplateType, build_template, parameter_names, all_parameters, compute_perf, perf_metric, out):
gen = GeneticOperators(context.devices[0], statement, all_parameters, parameter_names, TemplateType, build_template)
creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
creator.create("Individual", list, fitness=creator.FitnessMin)
toolbox = base.Toolbox()
toolbox.register("individual", tools.initIterate, creator.Individual, gen.init)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
toolbox.register("evaluate", gen.evaluate)
toolbox.register("mate", tools.cxTwoPoint)
toolbox.decorate("mate", gen.repair)
toolbox.register("mutate", gen.mutate)
toolbox.decorate("mutate", gen.repair)
toolbox.register("select", tools.selBest)
pop = toolbox.population(n=30)
hof = deap.tools.HallOfFame(1)
best_performer = lambda x: max([compute_perf(hof[0].fitness.values[0]) for t in x])
best_profile = lambda x: '(%s)'%','.join(map(str,hof[0]))
stats = deap.tools.Statistics(lambda ind: ind.fitness.values)
stats.register("max (" + perf_metric + ")", lambda x: max([compute_perf(hof[0].fitness.values[0]) for t in x]))
stats.register("profile ", lambda x: '(%s)'%','.join(map(str,hof[0])))
pop = eaMuPlusLambda(pop, toolbox, 30, 50, cxpb=0.2, mutpb=0.3, maxtime='3m0s', maxgen=200, halloffame=hof, compute_perf=compute_perf, perf_metric=perf_metric)