The objective of this work is to develop adaptive software cache management techniques that will allow programs written for shared memory multiprocessors to be executed efficiently on distributed memory machines. These techniques will facilitate a system that overcomes the architectural limitations of shared memory machines, while maintaining their advantages in terms of ease of programming. Translation from the shared memory programming model to the distributed memory hardware is done by runtime software, with the aid of hints provided by the user or by the compiler. The runtime system implements an adaptive cache coherence mechanism that exploits semantic information about the expected or observed access behavior of particular data objects. Preliminary measurements on a adaptive caching outperforms static cache coherence mechanisms, while extracting only limited cost when coherence is implemented in software. These experiments will be extended to include a broad range of programs.