Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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