Ray tracing uses very simple vector calculations. So simple that I just wrote a MATLAB program to do ray tracing in about two hours. The way ray tracing works is to calculate where one vector will intersect the surface of a medium with a different refractive index. Once this intersection is achieved, Snell's law (n_1*Q_1=n_2*Q_2, where n is the refractive index and Q is the incident angle, 1 and 2 are the two different media interfacing at the surface) is the only calculation. Then, you just look for another point at which the ray will intersect with a surface, rinse and repeat. Thus, each ray can run in parallel to every other ray, but the calculations for each ray must be performed in series.
My particular application involves only one collimated light source in a 2-D plane, but doing this in 3-D becomes much more expensive. How expensive depends on the density of rays you need to obtain good image quality. There are a few simple averaging techniques I can think of that would make it more efficient, but by and large, the best image quality will always come from tracing one ray per pixel. This necessarily requires many in-series computations for complex scenes, while the number of parallel operations (number of rays) is pretty much fixed. I don't know that much about how GPUs work, but hopefully from this description you can figure out why a CPU or GPU might be better.