The Deterministic Parallel Java Installation Manual
Version 1.0

University of Illinois at Urbana-Champaign

Revised July 2010

This document explains how to install Deterministic Parallel Java (DPJ), so you can use it to compile and run programs. It also explains how to build DPJ from source code, in case you wish to study and/or modify the compiler internals. A working knowledge of Java is required. Please also consult The Deterministic Parallel Java Tutorial and The Deterministic Parallel Java Language Reference Manual for further details about the language.

The instructions in this document assume that you are working in a UNIX-like system (including Linux, Mac OS X, etc.). Everything should work in Windows, but we have not tested DPJ on Windows systems. To follow the instructions as stated here, you will have to install Cygwin on your Windows system to get a UNIX-like interface and tool set.


1  Before You Begin

Thank you for you interest in DPJ. This section covers the information you need to know before installing DPJ on your system.

1.1  Requirements

DPJ is based on the Java language and javac compiler from Sun Microsystems. This manual assumes that the reader is familiar with Java, including compiling and running Java programs. You will need at least a Java Development Environment (JDK) to build and run DPJ codes. If you wish to work on the compiler sources you will need a Java Development Kit (JDK) to build the compiler from source. We recommend the latest Sun JDK from

1.2  Developer or User?

Instructions and requirements are slightly different depending on whether you want to use DPJ (user install) or develop DPJ (developer install). A user install of DPJ includes the bytecode versions of the compiler and runtime, documentation, and the DPJ source code for the benchmarks. A developer install of DPJ includes everything from the user install, and adds the compiler and runtime sources and build environment.

Performing a user install is easier, but there are two reasons to do a developer install:
  1. You are interested in reading or modifying the source code for the DPJ compiler and/or runtime; or
  2. You want access to the latest updates to the DPJ compiler, without waiting for the next bytecode release.

1.2.1  Requirements for User Install

For a user install of DPJ, do the following:
  1. Make sure you have a Java Devlopment Kit (JDK) installed. As of this writing we have tested with JDK 1.6.0_20.
  2. Follow the instructions in § 2 to do the installation and start using DPJ.

1.2.2  Requirements for Developer Install

For a developer install of DPJ, do the following:
  1. Make sure you have a JDK (at least Java 6) installed.
  2. Make sure that you have a working installation of Apache ant, the Java build tool.
  3. Make sure you have a working installation of git, the version control system.
  4. Make sure you have a working make.
  5. The Eclipse IDE is invaluable for studying and modifying large Java programs, so we recommend installing it. See
  6. Follow the instructions in § 3 to do the installation. Then read §§ 2.2 and 2.3 to learn how to use DPJ.

1.3  What's in the Release

The release directory structure contains the following directories:

1.4  DPJ Resources

You should keep the following resources in mind as you work with DPJ:
  1. The DPJ home page:
  2. The DPJ public code repository:
  3. The DPJ development mailing list: Joining the list allows you to follow major announcements, news, and technical discussions regarding DPJ. To subscribe to the list, please visit

  4. DPJ documentation is located in the Documentation directory of the DPJ release and is also available on the DPJ web site at
The DPJ development team appreciates your feedback and questions. Please check the email list archives before submitting a question or bug report. We prefer using the list for submissions so that the entire DPJ community can benefit from the growing knowledge base of questions and answers.

1.5  DPJ License

The DPJ software is subject to the following licenses: See the file LICENSE.TXT in the top-level directory of the DPJ software for further license information.

2  User Install

This section explains how do a binary installation of DPJ, including the bytecode version of the DPJ compiler and runtime and the source code for the DPJ benchmarks. If you install this way, then you can compile and run DPJ programs. However, you will not have access to the source code for the DPJ compiler. (The runtime source code is included in the user install, because you need that to compile against the runtime. See § 2.2.) If you want to study or modify the compiler and runtime source code, then you should install from the git source base, as described in § 3.

2.1  Installation and setup

To install the bytecode version of the compiler and runtime, do the following:
  1. Get the DPJ binary install tarball from
  2. Unpack the tarball:
    tar -xvf dpjbin.tar 
  3. Set DPJ_ROOT and your PATH:
    setenv DPJ_ROOT ${HOME}/dpjbin
    setenv PATH ${PATH}:${DPJ_ROOT}/Implementation/bin
    This assumes that dpjbin is in your home directory; if not, make the necessary changes.
  4. To check that you have a good installation, build the programs in the directory Benchmarks/Kernels:
    cd dpjbin/Benchmarks/Kernels
  5. Test the kernels:
    make test-all
You are now ready to compile and run DPJ programs.

2.2  Compiling DPJ Programs

Compiling DPJ programs is a two-step process. First, you invoke the DPJ compiler dpjc to translate DPJ source to plain Java source. Then you use an ordinary Java compiler (such as javac) to translate the Java source to bytecode that can be run on a Java virtual machine.

The following subsections explain these compilation steps in detail. Further, the directory ${DPJ_ROOT}/Benchmarks contains a file Makefile.common that illustrates how to set up a build environment for managing these steps, including automatic management of the subdirectories used to hold the translated Java and class files. You can also include the Makefile.common in your own makefiles, getting the benefit of this setup with almost no effort. See ${DPJ_ROOT}/Benchmarks/Kernels/Makefile for an example.

2.2.1  Translating DPJ Source to Java Source

You invoke the DPJ compiler by saying dpjc on the command line, followed by some DPJ files to compile. The DPJ compiler translates the DPJ source to Java source, so it's best to direct the output of the DPJ compiler to a different directory, to avoid name collisions. For example, the command sequence
mkdir java
dpjc -d java
translates the DPJ files and into the plain Java files and in the directory java.

Since dpjc is based on javac, you can use all the command-line options that javac supports. In addition, dpjc supports the following options: An important limitation of the DPJ compiler, as of DPJ v1.0, is that it has limited support for separate compilation. For example, in ordinary Java, if defines a class Foo, and defines a class Bar that uses Foo, you can compile to Foo.class separately, and later compile to Bar.class, as long as Foo.class is in the class path specified on the compiler command line.

In DPJ, you can still do this if is an ordinary Java file (i.e., it doesn't have any DPJ annotations). However, any source files containing DPJ annotations must be compiled together with code that depends on them. That is because DPJ's region and effect annotations are currently not represented in the bytecode (i.e., DPJ uses ordinary Java bytecode). Therefore, the compiler needs all the source files containing the DPJ annotations. In particular, in the example given above, if class Foo is defined with a region parameter, and you attempt to compile class Bar that uses Foo by linking against Foo.class, then the compiler will generate an error, saying that Foo doesn't take parameters. That's because the region parameter information is erased in the Foo.class bytecode. Instead, you need to compile and together, so the compiler can see the parameter. The same limitation applies to the classes in the DPJ runtime; see § 7 of The Deterministic Parallel Java Language Reference Manual for more details.

2.2.2  Compiling Generated Java Source

You can use any Java compiler to translate the generated Java source to bytecode. When you do this, you must put the DPJ runtime classes in the class path. For example, the command sequence
mkdir classes
javac -cp ${DPJ_ROOT}/Implementation/Runtime/classes -d classes java/*.java
compiles the translated Java files in directory java to bytecode, and puts the resulting class files in classes. The DPJ tools include a command dpj-javac, which is a convenience wrapper for javac that includes the runtime classes in the class path for you automatically. For example
mkdir classes
dpj-javac -d classes java/*.java
is equivalent to the above.

2.3  Running DPJ Programs

You run DPJ programs by saying dpj on the command line, followed by one or more Java classes to execute. The classes, and any classes they depend on, must be in the class path. For example:
dpj -cp classes Foo
The options for setting the class path and the other runtime options are the same as for java. In fact, dpj just invokes the ordinary java after adding the DPJ runtime classes to the class path, so you can use java to run DPJ programs if you want; you just have to add the runtime classes manually. For example:
java -cp ${DPJ_ROOT}/Implementation/Runtime/classes:classes Foo
The DPJ runtime has several configurable parameters. These are set in one of two ways. First, they can be passed as command-line arguments to the program. The special DPJ command-line arguments must come first; they are processed by the runtime and then stripped from the argument list, which is passed to the main program. For example, the following invocation of the class Foo sets the DPJ foreach cutoff (explained below) to 100, then passes 42 and bar as the command-line arguments to the program:
dpj -cp classes Foo –dpj-foreach-cutoff 100 42 bar
The following command-line options are processed specially by the DPJ runtime as stated above. Each of them must be followed by a numeric argument; if not, an error is reported. If the options are not present, then the default is used as stated below. The second way to set the runtime parameters is to assign to them from within the program. This is useful if you want different foreach loops in your program to use different parameters. See the runtime API documentation (available on the DPJ web site) for information about how to do this.

3  Developer Install

3.1  Installation and setup

To install the DPJ compiler and runtime from source, do the following.
  1. Check that your system meets the requirements in § 1.1.
  2. Get the source code distribution. We recommend using Eclipse to check out the source code; that way you'll have access to all of Eclipse's code browsing and editing features. Go to to get Eclipse. Then you'll need to install EGit (Git for Eclipse). This tutorial tells you how to do it:
    Then you can check out the DPJ source tree from inside Eclipse, again as explained in the tutorial. Use this as the repository URL:
    The following steps assume you are calling the root of the working directory DPJ and putting it in your home directory. If not, make the appropriate adjustments.

    If you don't want to use Eclipse, you can check out the DPJ source tree from the command line:
    cd ~
    git clone git:// DPJ
    Again, make the appropriate adjustments if you are putting the root of the working directory somewhere else.
  3. Set the DPJ_ROOT environment variable. For example, if the root of your DPJ tree is DPJ in your home directory and you are using the C shell, put this in your .cshrc file:
    setenv DPJ_ROOT ~/DPJ
    Then do
    source ~/.cshrc
  4. Tell ant to build the compiler, using your JDK:
    cd ~/DPJ/Implementation/Compiler/make
    If your JDK is not located at /usr/bin/jvm/java, then substitute the appropriate path.
  5. A successful compiler build puts jar files for the compiler and related tools (such as javadoc) in
    The executable files dpjc and dpj in Implementation/bin invoke these jar files.
  6. Add the DPJ compiler bin to your PATH:
    setenv PATH ${PATH}:${DPJ_ROOT}/Implementation/bin/
  7. Build the runtime classes located at ${DPJ_ROOT}/Implementation/Runtime. You can expect some warnings.
    cd ../../Runtime/

  8. You can now build and run the kernels:
    cd ${DPJ_ROOT}/Benchmarks/Kernels

  9. Then run all the kernel tests:
    make test-all

3.2  Testing the Installation

  1. JUnit 4 tests are in ${DPJ_ROOT}/Implementation/Compiler/test/dpj-junit-tests. The corresponding DPJ source files are in test/dpj-programs.
  2. The JUnit tests are designed to be run from within Eclipse, by running the launcher file
    If the JUnit tests fail with a MethodNotFound error, it is probably because the classpath is wrong. Many of the javac classes are included in the system library (rt.jar), and so the DPJ versions must precede the system library in the classpath. If you use the launcher, this error should not happen.

3.3  Browsing and Modifying the Compiler Code

After an initial ant build, DPJ javac will build automatically in Eclipse (albeit to a bin/ directory instead of build/). However, if any of the resource bundles are changed (be sure to change the .properties files in
and not the generated .java files!), the compiler must be re-built using the ant script.

The ant script bootstraps the compiler. So if there is an internal compiler error, it is due to a fault in the DPJ compiler. Note also that the compiler may compile successfully in Eclipse but fail when it is bootstrapped in the ant script due to differences between pure Java and DPJ (or an error in the DPJ compiler). In particular, note that the following keywords are reserved in DPJ and therefore may not be used as variable names (in any DPJ program, including the DPJ compiler):
This document was translated from LATEX by HEVEA.