There are many ways to program multiprocessor computers and message passing is one of the most popular and widespread approaches. This paper deeply investigates both the design issues and performance of message passing libraries like PVM, MPICH, and mpiGAMMA. We analyze how libraries allow the user to send and receive data packets and how different programming choices can strongly affect the performance of a parallel application. A set of test programs have been used to measure communication delays, latencies due to send and receive procedures, and throughputs.