Source: https://www.cac.cornell.edu/education/training/StampedeJune2013/ParallelProgramming.pdf