...
MATLAB can be used by loading its module. We highly recommend to choose a particular – better: the newest – version, e. g.:
...
...
Supported Releases of MATLAB and MATLAB Compiler Runtime
MATLAB Release (Patch level) | MATLAB Compiler Runtime | Comment |
---|
R2019bloadmatlab/R2019b-generic Codeblock |
---|
|
matlabmcrR2019b-genericR2019b | recommended version | R2019a (Update 5) | Codeblock |
---|
|
2018-intel
> module load matlab/ |
|
R2019a_Update5 |
Codeblock |
---|
| > module remove intel-mpi
> module load |
|
matlab-mcr/R2019a-genericR2019a | Trouble Loading MATLAB Module
...
intel-mpi/2018-intel
> module matlab-mcr/R2022a |
| R2022a |
Hinweis |
---|
recommended version |
|
R2021b (Update 3)
| |
...
...
mpi
> module load intel-mpi/2018-intel
> module load matlab/R2021b_Update3-generic |
| |
...
...
Hinweis |
---|
This is a fallback solution! Old software stacks are not supported anymore! Some MATLAB features might not work because according configurations refer to the CoolMUC-2 system used before March 2020! |
Useful MATLAB Commands
Please consider: All MATLAB commandline arguments are case-sensitive!
...
intel-mpi
> module load intel-mpi/2018-intel
> module load matlab-mcr/R2021b_Update2 |
| R2021b (Update 2)
| |
R2021a (Update 6) |
Codeblock |
---|
| > module remove intel-mpi
> module load intel-mpi/2018-intel
> module load matlab/R2021a_Update6-generic |
|
Codeblock |
---|
| > module remove intel-mpi
> module load intel-mpi/2018-intel
> module load matlab-mcr/R2021a_Update6 |
| R2021a (Update 6)
| |
Availability
| Linux Cluster (CoolMUC-2) | Linux Cluster (CoolMUC-2) SuperMUC-NG |
| |
Warnung |
---|
Using the default Intel-MPI module (Version 2019 or newer versions), unintended crashes of parallel MATLAB jobs might occur. Please switch to Intel MPI 2018. |
Useful MATLAB Commands
Run MATLAB via the "matlab" command only or add command-line arguments. Please consider: All MATLAB command-line arguments are case-sensitive!
Codeblock |
---|
|
> matlab arg_1 ... arg_N |
Command-line argument | Meaning |
---|
no argument | Start MATLAB GUI. |
-nodesktop | Start MATLAB without desktop but allow GUI and graphics output |
...
...
. |
-nodisplay | Start MATLAB without any GUI support |
...
...
. |
-singleCompThread | Some intrinsic MATLAB functions automatically exploit multithreading. MATLAB can be forced to disable this feature |
...
...
.
Warnung |
---|
Use this option for any work on the login nodes! Involving multiple threads (many MATLAB functions/operators use that by default) might cause a high load on the node and handicapping other users! MATLAB applications, which use multiple threads or multiple processes on login nodes, will be terminated by system administrators!
|
|
-r myfunc | Run a MATLAB script or function, e. g. myfunc.m |
...
...
Interactive MATLAB Jobs in a Nutshell – the Convenient Way
...
Usecases
Depending on the purpose, there are different possibilities to use MATLAB interactively:
- MATLAB computations with focus on visualisation: We recommend to use our Remote Visualisation System.
- Pure MATLAB computations: Interactive MATLAB sessions may be started on compute nodes of CoolMUC-2 or CoolMUC-3 by employing interactive Slurm jobs (see Slurm documentation).
Constraints
- Interactive jobs depend on the availability of compute resources. Matlab may not start immediately.
- Matlab will run on 1 compute node.
- The time limit is set to 2 hours (= maximum time for interactive Slurm sessions).
...
Slurm job script | Matlab script |
---|
Serial batch job Warnung |
---|
No parallelization at all, MATLAB is intended to run on a single core. Please , use the "serial" cluster of the Linux Cluster! |
|
---|
Codeblock |
---|
language | bash |
---|
title | matmul_serial.slurm |
---|
linenumbers | true |
---|
collapse | true |
---|
| #!/bin/bash
#SBATCH -o ./out/matlab_job%x.%j.%N.out
#SBATCH -e ./out/matlab_job%x.%j.%N.err
#SBATCH -D ./
#SBATCH -J matlab_serial_batch_job
#SBATCH --get-user-env
#SBATCH --export=NONE
#SBATCH --clusters=serial
#SBATCH --partition=serial_std
#SBATCH --nodes=1
#SBATCH --tasks-per-node=1
#SBATCH --cpus-per-task=1
#SBATCH --mem=10000
#SBATCH --time=0:30:00
# Use valid email address here!
# -per-node=1
#SBATCH --mailcpus-per-typetask=all1
# #SBATCH --mem=10000M
#SBATCH --mail-user=my_email_address@my_domaintime=0:30:00
# As needed, remove/adjust memory requirement "--mem" in MB
module load slurm_setup
# module load matlab/R2019b-generic <MATLAB MODULE> # EDIT HERE (see supported releases)
# Example: matrix-matrix multiplication C = A*B
# with A of size NROWA x NCOLA and
# B of size NROWB x NCOLB
NROWA=1000
NCOLA=2000
NROWB=2000
NCOLB=5000
# Run MATLAB
# => Using option -r don't add file extension .m to the function call!
# => MATLAB commandline arguments are case-sensitive!
matlab -nodisplay -singleCompThread \
-r "matmul_serial([$NROWA $NCOLA], [$NROWB $NCOLB]);" |
|
Codeblock |
---|
language | text |
---|
title | matmul_serial.m |
---|
linenumbers | true |
---|
collapse | true |
---|
| function [C, comptime] = matmul_serial(size_A, size_B)
%===============================================================================
% MATLAB EXAMPLE: SERIAL HELLO WORLD
% -> matrix-matrix multiplication C = A*B
%
% INPUT
% size_A, size_B ... 2-element row vectors defining sizes of A and B
% OUTPUT
% C ................ result
% comptime ......... computation time (matrix product only)
%===============================================================================
%===============================================================================
% Check input
%===============================================================================
if nargin~=2
error('Invalid number of input arguments!');
end
if size_A(2)~=size_B(1)
error(sprintf('Dimension mismatch of A (%d columns) and B (%d rows)!',...
size_A(2), size_B(1)));
end
%===============================================================================
% Work
%===============================================================================
% Hello message from compute node
fprintf('Hello from MATLAB process PID=%d running on node %s!\n',...
feature('getpid'),...
strtrim(evalc('system(''hostname'');')));
% generate well-defined matrices
NA = prod(size_A);
NB = prod(size_B);
A = reshape( linspace( 1,NA, NA), size_A );
B = reshape( linspace(NB, 1, NB), size_B );
% compute
tic;
C = A*B;
comptime = toc;
fprintf('serial computation of matrix-matrix product:\n');
fprintf('\ttime = %.2f s\n', comptime); |
|
Parallel job using multithreading Warnung |
---|
MATLAB will run on a single compute node. Please use the partition "cm2_tiny" in cluster "cm2_tiny"!
|
|
---|
Codeblock |
---|
language | bash |
---|
title | matmul_mthread.slurm |
---|
linenumbers | true |
---|
collapse | true |
---|
| #!/bin/bash
#SBATCH -o ./out/matlab_job%x.%j.%N.out
#SBATCH -e ./out/matlab_job%x.%j.%N.err
#SBATCH -D ./
#SBATCH -J matlab_threading_batch_job
#SBATCH --get-user-env
#SBATCH --export=NONE
#SBATCH --clusters=cm2
#SBATCH --partitionclusters=cm2_tiny
#SBATCH --qospartition=cm2_tiny
#SBATCH --nodes=1
#SBATCH --tasks-per-node=1
#SBATCH --cpus-per-task=14
#SBATCH --time=00:30:00
#
module Use valid email address here!
# #SBATCH --mail-type=all
# #SBATCH --mail-user=my_email_address@my_domain
module load slurm_setup
module load matlab/R2019b-genericload slurm_setup
# module load <MATLAB MODULE> # EDIT HERE (see supported releases)
# Example: matrix-matrix multiplication C = A*B
# with A of size NROWA x NCOLA and
# B of size NROWB x NCOLB
NROWA=1000
NCOLA=2000
NROWB=2000
NCOLB=5000
# Run MATLAB
# => Using option -r don't add file extension .m to the function call!
# => MATLAB commandline arguments are case-sensitive!
matlab -nodisplay \
-r "matmul_mthread([$NROWA $NCOLA], [$NROWB $NCOLB]);" |
|
Codeblock |
---|
language | text |
---|
title | matmul_mthread.m |
---|
linenumbers | true |
---|
collapse | true |
---|
| function [C, comptime] = parallel_mthread(size_A, size_B)
%===============================================================================
% MATLAB EXAMPLE: PARALLEL HELLO WORLD USING MULTITHREADING
% -> matrix-matrix multiplication C = A*B
%
% INPUT
% size_A, size_B ... 2-element row vectors defining sizes of A and B
% OUTPUT
% C ................ result
% comptime ......... computation time (matrix product only)
%===============================================================================
%===============================================================================
% Check input
%===============================================================================
if nargin~=2
error('Invalid number of input arguments!');
end
if size_A(2)~=size_B(1)
error(sprintf('Dimension mismatch of A (%d columns) and B (%d rows)!',...
size_A(2), size_B(1)));
end
%===============================================================================
% Manage multithreading
%===============================================================================
% Get number of threads depending on job type (batch job or interactive job).
% In batch jobs 1 MATLAB task will use "nw" threads.
%
% obtain number of threads from Slurm environment variables
cluster = getenv('SLURM_CLUSTER_NAME');
if strcmp(cluster, 'inter')
% interactive job
nw = str2num(getenv('SLURM_JOB_CPUS_PER_NODE'));
elseif strcmp(cluster, 'cm2') || ...
NODE'));
elseif strcmp(cluster, 'mpp3cm2_tiny') || ...
strcmp(cluster, 'ivymucmpp3')
% batch job
nw = str2num(getenv('SLURM_CPUS_PER_TASK'));
else
% default
nw = 1;
end
% set threads
maxNumCompThreads(nw);
%===============================================================================
% Work
%===============================================================================
fprintf('Hello from MATLAB process PID=%d running on node %s!\n',...
feature('getpid'),...
strtrim(evalc('system(''hostname'');')));
% generate well-defined matrices
NA = prod(size_A);
NB = prod(size_B);
A = reshape( linspace( 1,NA, NA), size_A );
B = reshape( linspace(NB, 1, NB), size_B );
% compute
tic;
C = A*B;
comptime = toc;
fprintf('parallel computation (multithreading) of matrix-matrix product:\n');
fprintf('\tnumber of threads = %d\n', nw);
fprintf('\ttime = %.2f s\n', comptime); |
|
Parallel batch job using Parallel Computing Toolbox (PCT) Warnung |
---|
MATLAB will run on a single compute node. Please use the partition "cm2_tiny" in cluster "cm2_tiny"!
|
|
---|
Codeblock |
---|
language | bash |
---|
title | matmul_pct.slurm |
---|
linenumbers | true |
---|
collapse | true |
---|
| #!/bin/bash
#SBATCH -o ./out/matlab_job%x.%j.%N.out
#SBATCH -e ./out/matlab_job%x.%j.%N.err
#SBATCH -D ./
#SBATCH -J matlab_pct_batch_job
#SBATCH --get-user-env
#SBATCH --export=NONE
#SBATCH --clusters=cm2
#SBATCH --partition=cm2_tiny
#SBATCH --qospartition=cm2_tiny
#SBATCH --nodes=1
#SBATCH --tasks-per-node=4
#SBATCH --cpus-per-task=1
#SBATCH --time=00:30:00
# Use valid email address here!
# #SBATCH --mail-type=all
# #SBATCH --mail-user=my_email_address@my_domain
module load slurm_setup
# IMPORTANT
# Default settings of Intel MPI module may disrupt
# functionality of Parallel-Computing-Toolbox!
# Do one of the following solutions:
# (1) Unload Intel MPI module:
module mpi.intel:rm intel-mpi
module rm mpi.intel
# (2) If Intel MPI module is mandatory, adduncomment next line 2 lines
# module load intel-mpi/2018-intel
# export KMP_AFFINITY=granularity=thread,none
# module load slurm_setup
module load matlab/R2019b-generic <MATLAB MODULE> # EDIT HERE (see supported releases)
# Example: matrix-matrix multiplication C = A*B
# with A of size NROWA x NCOLA and
# B of size NROWB x NCOLB
NROWA=1000
NCOLA=2000
NROWB=2000
NCOLB=5000
# Run MATLAB
# => Using option -r don't add file extension .m to the function call!
# => MATLAB commandline arguments are case-sensitive!
matlab -nodisplay -singleCompThread \
-r "matmul_pct([$NROWA $NCOLA], [$NROWB $NCOLB]);" |
|
Codeblock |
---|
language | text |
---|
title | matmul_pct.m |
---|
linenumbers | true |
---|
collapse | true |
---|
| function [Cglob, comptime] = matmul_pct(size_A, size_B)
%===============================================================================
% MATLAB EXAMPLE: PARALLEL HELLO WORLD USING PCT TOOLBOX
% -> matrix-matrix multiplication C = A*B
%
% INPUT
% size_A, size_B ... 2-element row vectors defining sizes of A and B
% OUTPUT
% C ................ result
% comptime ......... computation time (matrix product only)
%===============================================================================
%===============================================================================
% Check input
%===============================================================================
if nargin~=2
error('Invalid number of input arguments!');
end
if size_A(2)~=size_B(1)
error(sprintf('Dimension mismatch of A (%d columns) and B (%d rows)!',...
size_A(2), size_B(1)));
end
%===============================================================================
% Verify that no parallel pool is initialized by creating/deleting a dummy pool
%===============================================================================
if ~isempty(gcp('nocreate'))
poolobj = gcp('nocreate');
delete(poolobj);
end
%===============================================================================
% Start parallel pool
%===============================================================================
% Get number of workers depending on job type. Start parallel pool via "local"
% cluster object.
%
% obtain number of tasks from Slurm environment variables
cluster = getenv('SLURM_CLUSTER_NAME');
if strcmp(cluster, 'inter')
% interactive job
nw = str2num(getenv('SLURM_JOB_CPUS_PER_NODE'));
elseif strcmp(cluster, 'cm2_tiny') || ...
strcmp(cluster, 'serialcm2') || ...
strcmp(cluster, 'mpp3serial') || ...
strcmp(cluster, 'ivymucmpp3')
% batch job
nw = str2num(getenv('SLURM_NTASKS_PER_NODE'));
else
% default
nw = 1;
end
% disallow Threading
if maxNumCompThreads > 1
maxNumCompThreads(1);
warning('MultiThreading: number of threads has been set to 1!');
end
% create a local cluster object
pc = parcluster('local');
% set number of workers
pc.NumWorkers = nw;
% set the JobStorageLocation to SCRATCH (default: HOME -> not recommended)
pc.JobStorageLocation = strcat(getenv('SCRATCH'));
% start the parallel pool
poolobj = parpool(pc, nw);
%===============================================================================
% Work
%===============================================================================
spmd
fprintf('Hello from MATLAB process PID=%d running on node %s!\n',...
feature('getpid'),...
getenv('HOSTNAME'));
end
% generate well-defined matrices
NA = prod(size_A);
NB = prod(size_B);
A = reshape( linspace( 1,NA, NA), size_A );
B = reshape( linspace(NB, 1, NB), size_B );
% distribute data to workers and do parallel computation
spmd
Aloc = codistributed(A, codistributor2dbc([nw 1]));
Bloc = codistributed(B, codistributor2dbc([1 nw]));
tic;
Cloc = Aloc*Bloc;
t = toc;
end
comptime = max(cell2mat(t(:)));
fprintf('parallel computation (MPI) of matrix-matrix product:\n');
fprintf('\tnumber of tasks (MATLAB workers) = %d\n', nw);
fprintf('\ttime = %.2f s\n', comptime);
Cglob = gather(Cloc);
%===============================================================================
% Close parallel pool
%===============================================================================
delete(poolobj); |
|
...