Programmers using a wide variety of shared-memory multiprocessors cannot yet rely on the availability of programming tools other than K&R C and Fortran 77. To overcome the sequential nature of these languages, vendors usually provide parallel programming primitives via user-callable libraries. Unfortunately, the vendor-provided libraries often differ substantially. In addition to providing differing mechanisms to create and synchronize processes; libraries often have different models of how the processes share and allocate memory within their address space. This paper describes a common library interface to seven different shared-memory multiprocessors. Surprisingly, this library needs only two pages of implementation on each of the multiprocessors. However, the effect on the programming model is significant. Programmers must use the library's virtual machine model to obtain efficient programs on all the different physical machines.