JUSTUS2/Software/Julia/Parallel Programming: Difference between revisions

From bwHPC Wiki
< JUSTUS2‎ | Software‎ | Julia
Jump to navigation Jump to search
No edit summary
Line 22: Line 22:
Start Julia with option <code>-t x</code> where x is
Start Julia with option <code>-t x</code> where x is
the number of (Julia) threads or the keyword <code>auto</code>, which however doesn't determine correctly the number of threads requested from SLURM with the option <code>--cpus-per-task</code>. Alternatively, you can set the environment variable <code>JULIA_NUM_THREADS</code>. See the [https://docs.julialang.org/en/v1/manual/multi-threading/ Julia documentation] for more details.
the number of (Julia) threads or the keyword <code>auto</code>, which however doesn't determine correctly the number of threads requested from SLURM with the option <code>--cpus-per-task</code>. Alternatively, you can set the environment variable <code>JULIA_NUM_THREADS</code>. See the [https://docs.julialang.org/en/v1/manual/multi-threading/ Julia documentation] for more details.

== Multiple Processes ==
With the [https://docs.julialang.org/en/v1/manual/distributed-computing/ Distributed package] Julia has native support for distributed computing using multiple processes on different nodes. To integrate well into SLURM, the use of the [https://github.com/JuliaParallel/ClusterManagers.jl <code>ClusterManagers.jl</code>], providing the <code>addprocs_slurm()</code> function, is advised to spawn the worker processes.

== MPI ==

Distributed computing using MPI can be performed leveraging the [https://github.com/JuliaParallel/MPI.jl <code>`MPI.jl</code>] package, which provides Julia wrappers for most of the standard MPI functions.

## CUDA

Revision as of 17:55, 8 October 2024

Parallel Programming in Julia

Julia supports several paradigms of parallel programming:

  1. Implicit multi-threading by math libraries (OpenBLAS, MKL)
  2. Explicit multi-threading using Julia threads (e.g. `Threads.@threads for`)
  3. Multiple processes on one ore more nodes
  4. Execution on GPUs/CUDA using CUDA.jl

All paradigms may be used at the same time, but must be chosen carefully, to obtain the desired performance.

Implict Multi-Threading

The number of threads used by the mathematical linear algebra libraries may be configured using BLAS.set_num_threads() from the LinearAlgebra package. Alternatively you can set the environment variables OPENBLAS_NUM_THREADS or MKL_NUM_THREADS if you use MKL.

If your code is already multi-threaded, you probably want to set the number of BLAS threads to 1, in order to avoid running too many competing threads, as every Julia thread comes with its own BLAS threads.


Explicit Multi-Threading

Start Julia with option -t x where x is the number of (Julia) threads or the keyword auto, which however doesn't determine correctly the number of threads requested from SLURM with the option --cpus-per-task. Alternatively, you can set the environment variable JULIA_NUM_THREADS. See the Julia documentation for more details.

Multiple Processes

With the Distributed package Julia has native support for distributed computing using multiple processes on different nodes. To integrate well into SLURM, the use of the ClusterManagers.jl, providing the addprocs_slurm() function, is advised to spawn the worker processes.

MPI

Distributed computing using MPI can be performed leveraging the `MPI.jl package, which provides Julia wrappers for most of the standard MPI functions.

    1. CUDA