Parallel Programming Concepts And Practice