An Introduction to Parallel Programming, 2nd ed.
The second edition of An Introduction to Parallel Programming is also an elementary introduction to programming parallel systems with MPI, Pthreads, and OpenMP. However, this edition also includes an introduction to programming GPUs using CUDA. The book should be used by students and professionals with some knowledge of programming conventional, single-processor systems, but who have little or no experience programming multiprocessor systems.
Here's an archive of the source code that's discussed in the book.