Modern GPUs utilize SIMD heavily (under various monikers: SPMD, SIMT, etc). Whatever the name, it fundamentally boils down to duplicating arithmetic units and applying the same instruction to many vector lanes, each of which represents an independent instance of the program. Because the non-arithmetic parts of the pipeline are shared, this allows packing more computation in a smaller amount of space.
This works well until conditional execution is thrown into the mix. It's possible (common, actually) that some of the instances will chose one branch and some will chose another. This is called "branch divergence," and is an active area of research.
I've recently written a compiler for a simple, C-like language that can produce parallel kernels for the instruction set of the processor I've been working on. It uses the LLVM backend I've already developed for this architecture. It's interesting to compare the generated code to a modern GPU, AMD's "Southern Islands" architecture.