This is an old revision of the document!
Julia Programming Language
Julia is a high-performance, high-level, dynamic programming language.
Distinctive aspects of Julia's design include a type system with parametric polymorphism in a dynamic programming language; with multiple dispatch as its core programming paradigm. Julia supports concurrent, (composable) parallel and distributed computing (with or without using MPI and/or the built-in corresponding to “OpenMP-style” threads), and direct calling of C and Fortran libraries without glue code. Julia uses a just-in-time (JIT) compiler that is referred to as “just-ahead-of-time” (JAOT) in the Julia community, as Julia compiles all code (by default) to machine code before running it.
Julia Modules
We currently offer the following Julia versions:
JGU HPC Modules ------------------- /cluster/easybuild/broadwell/modules/all ------------------- lang/Julia/1.5.3-linux-x86_64 lang/Julia/1.6.0-linux-x86_64 (D)
One can use a certain version with the following command:
module load lang/Julia/1.6.0-linux-x86_64
Submitting a Serial Julia Job
- hello_mogon.jl
println("Hello MOGON!")
- serial_julia_job.slurm
#!/bin/bash #SBATCH --partition=smp #SBATCH --account=<YourHPC-Account> #SBATCH --time=0-00:01:00 #SBATCH --mem=512 #0.5GB #SBATCH --ntasks=1 #SBATCH --job-name=julia_serial_example #SBATCH --output=%x_%j.out #SBATCH --error=%x_%j.err module purge module load lang/Julia julia hello_mogon.jl
cat julia_serial_example_*.out
Hello MOGON!
Submitting a Parallel Julia Job
Julia MPI Job
Julia MPI Setup
First, Julia must be configured for the use of MPI. For this purpose the MPI Wrapper for Julia is used. Log in to one ouf our Service-Nodes and then load Julia and the desired MPI module via:
module load mpi/OpenMPI/4.0.5-GCC-10.2.0 module load lang/Julia
Next, you need to build the MPI package for Julia with Pkg
:
julia -e 'ENV["JULIA_MPI_BINARY"]="system"; using Pkg; Pkg.add("MPI"); Pkg.build("MPI", verbose=true)'
The output should should be similar to the following if installation and build was successful:
[ ... ] [ Info: using system MPI ] 0/1 ┌ Info: Using implementation │ libmpi = "libmpi" │ mpiexec_cmd = `mpiexec` └ MPI_LIBRARY_VERSION_STRING = "Open MPI v4.0.5, package: Open MPI henkela@login22.mogon Distribution, ident: 4.0.5, repo rev: v4.0.5, Aug 26, 2020\0" ┌ Info: MPI implementation detected │ impl = OpenMPI::MPIImpl = 2 │ version = v"4.0.5" └ abi = "OpenMPI"
Julia MPI Example
Now that MPI and Julia have been set up correctly, we can proceed to the example.
- hello_mogon_mpi.jl
using MPI MPI.Init() comm = MPI.COMM_WORLD my_rank = MPI.Comm_rank(comm) comm_size = MPI.Comm_size(comm) println("Hello MOGON! I am Rank ", my_rank, " of ", comm_size, " on ", gethostname()) MPI.Finalize()
- julia_mpi_job.slurm
#!/bin/bash #SBATCH --partition=parallel #SBATCH --account=<YourHPC-Account> #SBATCH --time=0-00:02:00 #SBATCH --mem-per-cpu=2048 #2GB #SBATCH --nodes=2 #SBATCH --ntasks-per-node=8 #SBATCH --job-name=mpi_julia #SBATCH --output=%x_%j.out #SBATCH --error=%x_%j.err module purge module load mpi/OpenMPI/4.0.5-GCC-10.2.0 module load lang/Julia export JULIA_MPI_PATH=$EBROOTOPENMPI srun julia -- hello_mogon_mpi.jl
cat mpi_julia_*.out
Hello MOGON! I am Rank 9 of 16 on z0278.mogon Hello MOGON! I am Rank 2 of 16 on z0277.mogon Hello MOGON! I am Rank 11 of 16 on z0278.mogon Hello MOGON! I am Rank 12 of 16 on z0278.mogon Hello MOGON! I am Rank 15 of 16 on z0278.mogon Hello MOGON! I am Rank 10 of 16 on z0278.mogon Hello MOGON! I am Rank 13 of 16 on z0278.mogon Hello MOGON! I am Rank 8 of 16 on z0278.mogon Hello MOGON! I am Rank 14 of 16 on z0278.mogon Hello MOGON! I am Rank 1 of 16 on z0277.mogon Hello MOGON! I am Rank 3 of 16 on z0277.mogon Hello MOGON! I am Rank 5 of 16 on z0277.mogon Hello MOGON! I am Rank 4 of 16 on z0277.mogon Hello MOGON! I am Rank 0 of 16 on z0277.mogon Hello MOGON! I am Rank 6 of 16 on z0277.mogon Hello MOGON! I am Rank 7 of 16 on z0277.mogon