def demo(im_filename, out_filename, no_optimalisations): from blip.code.trace_optimiser import Optimiser, ImmediatePass, PeepholePass, MemoryPass from blip.simulator import interpreter from blip.support import imageio from blip.simulator.opcodes import Imm, Mul, Add # settings block_size = (32, 32) out_ptr = block_size[0] * block_size[1] coeff = [[1, -2, 1]] * 3 # convolution implementation with map_neighborhood_to_pixel skeleton def convolution_op(code, coeff_v, val, acc, args, block_size): """ Simple convolution implementation. """ with scoped_alloc(code, 2) as (v, coeff_r): yield Imm(coeff_r, coeff_v) yield Mul(v, coeff_r, val) yield Add(acc, acc, v) def codegen(code, block_size, args): """ Map convolution to image. """ return map_neighborhood_to_pixel(code, 0, out_ptr, coeff, convolution_op, args, block_size) # Wrap optimisers optimiser = Optimiser(50) optimiser.register_pass(ImmediatePass(optimiser)) # optimiser.register_pass(PeepholePass(optimiser)) optimiser.register_pass(MemoryPass(optimiser)) def optim_wrapper(code, block_size, args): if no_optimalisations: print "optimalisations disabled" return codegen(code, block_size, args) else: return optimiser.run(code, codegen, block_size, args) # Render instruction trace f = open(out_filename + "_trace.txt", "w") def tag_str(instr): return ", ".join(instr.tag) if hasattr(instr, "tag") else "" f.write("\n".join(str(x).ljust(40) + " tags: " + tag_str(x) for x in optim_wrapper(Code(), block_size, {}))) f.close() # Run simulation code = Code() code.set_generator(optim_wrapper, block_size, {}) image = imageio.read(im_filename) sim = interpreter.Interpreter(code, image, block_size) sim.run() out = sim.gen_output_image(1) imageio.write(out_filename, out, 1)
def optimiser_wrapper(codegen): optimiser = Optimiser(400) # the loop hint doesn't improve the optimiser optimiser.register_pass(ImmediatePass(optimiser)) optimiser.register_pass(MemoryPass(optimiser)) # use this pass to avoid eliminate Nop annotations optimiser.register_pass(PeepholePass(optimiser)) def optim_wrapper(code, block_size, args): for x in optimiser.run(code, codegen, block_size, args): yield x return optim_wrapper