Persistent Memory Development Kit
Latest commit 360fb39 Oct 18, 2018

PMDK: Persistent Memory Development Kit

Build Status Build status Coverity Scan Build Status PMDK release version Coverage Status

The Persistent Memory Development Kit (PMDK) is a collection of libraries and tools for System Administrators and Application Developers to simplify managing and accessing persistent memory devices. For more information, see

To install PMDK libraries, either install pre-built packages, which we build for every stable release, or clone the tree and build it yourself. Pre-built packages can be found in popular Linux distribution package repositories, or you can check out our recent stable releases on our github release page. Specific installation instructions are outlined below.

Bugs and feature requests for this repo are tracked in our GitHub Issues Database.


  1. Libraries and Utilities
  2. Getting Started
  3. Version Conventions
  4. Pre-Built Packages for Windows
  5. Dependencies
  6. Building PMDK on Linux or FreeBSD
  7. Building PMDK on Windows
  8. Experimental Packages
  9. Contact Us

Libraries and Utilities

Available Libraries:

  • ​libpmem: provides low level persistent memory support

  • ​libpmemobj: provides a transactional object store, providing memory allocation, transactions, and general facilities for persistent memory programming.

  • ​libpmemblk: supports arrays of pmem-resident blocks, all the same size, that are atomically updated.

  • ​libpmemlog: provides a pmem-resident log file.

  • ​libvmem: turns a pool of persistent memory into a volatile memory pool, similar to the system heap but kept separate and with its own malloc-style API.

  • ​libvmmalloc1: transparently converts all the dynamic memory allocations into persistent memory allocations.

  • libpmempool: provides support for off-line pool management and diagnostics.

  • ​librpmem1: provides low-level support for remote access to persistent memory utilizing RDMA-capable RNICs.

Available Utilities:

  • ​pmempool: Manage and analyze persistent memory pools with this stand-alone utility

  • ​pmemcheck: Use dynamic runtime analysis with an enhanced version of Valgrind for use with persistent memory.

Currently these libraries only work on 64-bit Linux, Windows2, and 64-bit FreeBSD 11+3. For information on how these libraries are licensed, see our LICENSE file.

1 Not supported on Windows.

2 PMDK for Windows is feature complete, but not yet considered production quality.

3 DAX and libfabric are not yet supported in FreeBSD, so at this time PMDK is available as a technical preview release for development purposes.

Getting Started

Getting Started with Persistent Memory Programming is a tutorial series created by Intel Architect, Andy Rudoff. In this tutorial, you will be introduced to persistent memory programming and learn how to apply it to your applications.

Additionally, we recommend reading Introduction to Programming with Persistent Memory from Intel

Version Conventions

  • Builds are tagged something like 0.2+b1, which means Build 1 on top of version 0.2
  • Release Candidates have a '-rc{version}' tag, e.g. `0.2-rc3, meaning Release Candidate 3 for version 0.2
  • Stable Releases use a major.minor tag like 0.2

Pre-Built Packages for Windows

The recommended and easiest way to install PMDK on Windows is to use Microsoft vcpkg. Vcpkg is an open source tool and ecosystem created for library management.

To install the latest PMDK release and link it to your Visual Studio solution you first need to clone and set up vcpkg on your machine as described on the vcpkg github page in Quick Start section.

In brief:

	> git clone
	> cd vcpkg
	> .\bootstrap-vcpkg.bat
	> .\vcpkg integrate install
	> .\vcpkg install pmdk:x64-windows

The last command can take a while - it is PMDK building and installation time.

After a successful completion of all of the above steps, the libraries are ready to be used in Visual Studio and no additional configuration is required. Just open VS with your already existing project or create a new one (remember to use platform x64) and then include headers to project as you always do.


Required packages for each supported OS are listed below. It is important to note that some tests and example applications require additional packages, but they do not interrupt building if they are missing. An appropriate message is displayed instead. For details please read the DEPENDENCIES section in the appropriate README file.

See our Dockerfiles to get an idea what packages are required to build the entire PMDK, with all the tests and examples on the Travis-CI system.


You will need to install the following required packages on the build system:

  • autoconf
  • pkg-config
  • libndctl-devel (v60.1 or later)
  • libdaxctl-devel (v60.1 or later)
  • ndctl (v60.1 or later)

The following packages are required only by selected PMDK components or features:

  • libfabric (v1.4.2 or later) -- required by librpmem



  • autoconf
  • bash
  • binutils
  • coreutils
  • e2fsprogs-libuuid
  • gmake
  • libunwind
  • ncurses4
  • pkgconf

4 The pkg version of ncurses is required for proper operation; the base version included in FreeBSD is not sufficient.

Building PMDK on Linux or FreeBSD

To build from source, clone this tree:

	$ git clone
	$ cd pmdk

For a stable version, checkout a release tag as follows. Otherwise skip this step to build the latest development release.

	$ git checkout tags/1.4.2

Once the build system is setup, the Persistent Memory Development Kit is built using the make command at the top level:

	$ make

For FreeBSD, use gmake rather than make.

By default, all code is built with the -Werror flag, which fails the whole build when the compiler emits any warning. This is very useful during development, but can be annoying in deployment. If you want to disable -Werror, use the EXTRA_CFLAGS variable:

	$ make EXTRA_CFLAGS="-Wno-error"


	$ make EXTRA_CFLAGS="-Wno-error=$(type-of-warning)"

Make Options

There are many options that follow make. If you want to invoke make with the same variables multiple times, you can create a file in the top level directory and put all variables there. For example:

	$ cat
	EXTRA_CFLAGS_RELEASE = -ggdb -fno-omit-frame-pointer
	PATH += :$HOME/valgrind/bin

This feature is intended to be used only by developers and it may not work for all variables. Please do not file bug reports about it. Just fix it and make a PR.

Built-in tests: can be compiled and ran with different compiler. To do this, you must provide the CC and CXX variables. These variables are independent and setting CC=clang does not set CXX=clang++. For example:

	$ make CC=clang CXX=clang++

Once make completes, all the libraries and examples are built. You can play with the library within the build tree, or install it locally on your machine. For information about running different types of tests, please refer to the src/test/README.

Installing the library is convenient since it installs man pages and libraries in the standard system locations:

	(as root...)
	# make install

To install this library into other locations, you can use the prefix variable, e.g.:

	$ make install prefix=/usr/local

This will install files to /usr/local/lib, /usr/local/include /usr/local/share/man.

Prepare library for packaging can be done using the DESTDIR variable, e.g.:

	$ make install DESTDIR=/tmp

This will install files to /tmp/usr/lib, /tmp/usr/include /tmp/usr/share/man.

Man pages (groff files) are generated as part of the install rule. To generate the documentation separately, run:

	$ make doc

This call requires the following dependencies: pandoc. Pandoc is provided by the hs-pandoc package on FreeBSD.

Install copy of source tree can be done by specifying the path where you want it installed.

	$ make source DESTDIR=some_path

For this example, it will be installed at $(DESTDIR)/pmdk.

Build rpm packages on rpm-based distributions is done by:

	$ make rpm

To build rpm packages without running tests:


This requires rpmbuild to be installed.

Build dpkg packages on Debian-based distributions is done by:

	$ make dpkg

To build dpkg packages without running tests:

	$ make BUILD_PACKAGE_CHECK=n dpkg

This requires devscripts to be installed.

Testing Libraries on Linux and FreeBSD

Before running the tests, you may need to prepare a test configuration file (src/test/ Please see the available configuration settings in the example file src/test/

To build and run the unit tests:

	$ make check

To run a specific subset of tests, run for example:

	$ make check TEST_TYPE=short TEST_BUILD=debug TEST_FS=pmem

To modify the timeout which is available for check type tests, run:

	$ make check TEST_TIME=1m

This will set the timeout to 1 minute.

Please refer to the src/test/README for more details on how to run different types of tests.

Memory Management Tools

The PMDK libraries support standard Valgrind DRD, Helgrind and Memcheck, as well as a PM-aware version of Valgrind (not yet available for FreeBSD). By default, support for all tools is enabled. If you wish to disable it, supply the compiler with VG_<TOOL>_ENABLED flag set to 0, for example:


VALGRIND_ENABLED flag, when set to 0, disables all Valgrind tools (drd, helgrind, memcheck and pmemcheck).

The SANITIZE flag allows the libraries to be tested with various sanitizers. For example, to test the libraries with AddressSanitizer and UndefinedBehaviorSanitizer, run:

	$ make SANITIZE=address,undefined clobber check

The address sanitizer is not supported for libvmmalloc on FreeBSD and will be ignored.

Building PMDK on Windows

Clone the PMDK tree and open the solution:

	> git clone
	> cd pmdk/src
	> devenv PMDK.sln

Select the desired configuration (Debug or Release) and build the solution (i.e. by pressing Ctrl-Shift-B).

Testing Libraries on Windows

Before running the tests, you may need to prepare a test configuration file (src/test/testconfig.ps1). Please see the available configuration settings in the example file src/test/testconfig.ps1.example.

To run the unit tests, open the PowerShell console and type:

	> cd pmdk/src/test

To run a specific subset of tests, run for example:

	> RUNTESTS.ps1 -b debug -t short

To run just one test, run for example:

	> RUNTESTS.ps1 -b debug -i pmem_is_pmem

To modify the timeout, run:

	> RUNTESTS.ps1 -o 3m

This will set the timeout to 3 minutes.

To display all the possible options, run:

	> RUNTESTS.ps1 -h

Please refer to the src/test/README for more details on how to run different types of tests.

Experimental Packages

Some components in the source tree are treated as experimental. By default, those components are built but not installed (and thus not included in packages).

If you want to build/install experimental packages run:

	$ make EXPERIMENTAL=y [install,rpm,dpkg]

The librpmem and rpmemd packages

NOTE: The libfabric package required to build the librpmem and rpmemd is not yet available on stable Debian-based distributions. This makes it impossible to create Debian packages.

If you want to build Debian packages of librpmem and rpmemd run:

	$ make RPMEM_DPKG=y dpkg

Experimental Support for 64-bit ARM

There is an initial support for 64-bit ARM processors provided, currently only for aarch64. All the PMDK libraries except librpmem can be built for 64-bit ARM. The examples, tools and benchmarks are not ported yet and may not get built on ARM cores.

NOTE: The support for ARM processors is highly experimental. The libraries are only validated to "early access" quality with Cortex-A53 processor.

Contact Us

For more information on this library, contact Marcin Slusarz (, Andy Rudoff (, or post to our Google group.