Introduction to Parallel and Distributed Programming