I believe OpenCL is the way to go. I did a very simple Sega Genesis emulator and basically what you do is control with a very slow CPU a very fast hardware that does very simple things like drawing tiles.
You control the tile with something like a pointer with the CPU but it is draw by hardware. Same with sound.
It is not hard to do, it just takes time.