Have you thought about implementing a bidirectional integrator? (it looks like it's only sampling rays originating at the camera, but I could easily be overlooking something)
How are you handling scenes with many light sources?
What are your thoughts on using cuda versus something cross platform like opencl? I've been tinkering on a gpu enabled path tracer as well (not nearly as far along as this), and I've been restricting myself to C99 so that I can easily run the kernel on cuda/opencl/cpu, which I found can actually make for an easier debugging experience)
How big of a difference does using an SOA representation for vectors? I've understood that to be more of a SIMD type optimization, so I'm curious how it does on the GPU?