- Multilayered Abstractions for Partial Differential Equations. PhD Thesis, Imperial College, June 2013.
- Making Faster FEM Solvers, Faster. MPhil transfer report, Imperial College, July 2010.
- Generatively Programming Galerkin Projections on General Purpose Graphics Processing Units. MSc Project report, Imperial College, July 2009. Fluidity (developed by the Applied Modelling & Computation Group in the Department of Earth Science & Engineering) is a general purpose computational fluid dynamics code that uses the finite element method to solve the Navier-Stokes equations on adapting unstructured meshes. My MSc project was a pilot study into accelerating the assembly of large, sparse systems of equations using multicore architectures. CUDA versions of the assembly phase of two test problems were produced, resulting in almost an order of magnitude speedup over a multicore CPU. Since rewriting code for each multicore architecture is a labour intensive process, a compiler is produced that generates CUDA code from a high-level specification of the method written in the Unified Form Language. Targeting a new architecture only requires writing a new backend for the UFL compiler, and recompiling existing code.
- Epistemic Verification of Quantum Protocols. ISO Report, Imperial College, April 2009. I surveyed and evaluated some approaches to using epistemic logic to verify the behaviour of multi-agent systems where agents perform quantum computations.
- Accelerating Unstructured Mesh Computational Fluid Dynamics on the NVidia Tesla GPU Architecture. ISO Report, Imperial College, January 2009. I worked on a sparse conjugate-gradient solver for NVidia GPUs. This solver was compared against the PETSc solver in a finite element test problem which solves a Laplacian equation. The NVidia 280GTX GPU showed a speedup of up to 10 times over one core of an Intel Core 2 Duo 3GHz when solving systems generated by the test problem.
- An Investigation Into Value Profiling and its Applications. Undergraduate Project Report, Manchester Metropolitan University, May 2008. I collected value profile data for the execution of a subset of the MiBench suite of benchmarks executing inside the LLVM interpreter and on the x86 architecture. The inputs and outputs of instructions and the values transferred across the data bus were recorded. These profiles were used to guide the design of a cache that stores the outputs of computations, and an encoding scheme to reduce switching activity on the data bus.