How does memory coalescing work on a GPU, and how would you design a matrix multiplication kernel to maximize global memory bandwidth?