Explain the difference between thread blocks, warps (or wavefronts), and individual threads in GPU execution. How do you prevent thread divergence?