Parallel Computing on Distributed Memory Multiprocessors