MaMI is a memory interface implemented within our user-level thread library, Marcel. It allows developers to manage memory with regard to NUMA nodes thanks to an automatically gathered knowledge of the underlying architecture. The initialization stage preallocates memory heaps on all the NUMA nodes of the target machine, and user-made allocations then pick up memory areas from the preallocated heaps.
MaMI implements two methods to migrate data. The first method is based on the Next-touch policy, it is implemented as a user-level pager (mprotect() and signal handler for SIGSEGV). The second migration method is synchronous and allows to move data on a given node. Both move pages using the Linux system call move_pages(). We have also developed an implementation of a Next-touch policy in the kernel (see here). On systems which provide it, MaMI will use this method instead of the user-level one.
It is possible to evaluate reading and writing access costs to remote memory areas. Migration cost is based on a linear function on the number of pages being migrated.
Moreover, MaMI gathers statistics on how much memory is available and left on the different nodes. This information is potentially helpful when deciding whether or not to migrate a memory area.
Last updated on 2009/07/06.