Added script to empirically profile memory usage and time for execution.
This commit is contained in:
parent
055ca7ddc9
commit
f9bc6d032c
57
Dipolar-Gas-Simulator/+Helper/runWithProfiling.m
Normal file
57
Dipolar-Gas-Simulator/+Helper/runWithProfiling.m
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
function [varargout] = runWithProfiling(funcHandle, nOutputs, saveDirectory)
|
||||||
|
%RUNWITHPROFILING Profile runtime and memory usage, and log stats to JSON file.
|
||||||
|
%
|
||||||
|
% Usage:
|
||||||
|
% [a, b, c, stats] = runWithProfiling(@() sim.run(), 3, './Results/');
|
||||||
|
%
|
||||||
|
% Inputs:
|
||||||
|
% funcHandle - Function handle to run (e.g., @() sim.run())
|
||||||
|
% nOutputs - Number of outputs expected from funcHandle
|
||||||
|
% saveDirectory - Directory path to save stats JSON file
|
||||||
|
%
|
||||||
|
% Outputs:
|
||||||
|
% varargout - Outputs of funcHandle (1 to nOutputs)
|
||||||
|
% - Final output is a struct 'stats' with fields:
|
||||||
|
% .runtime - Wall-clock time (s)
|
||||||
|
% .workspaceMemoryMB - Total memory used (MB)
|
||||||
|
% .timestamp - ISO timestamp of run
|
||||||
|
% .hostname - System hostname
|
||||||
|
|
||||||
|
% Time the function
|
||||||
|
tStart = tic;
|
||||||
|
[varargout{1:nOutputs}] = funcHandle();
|
||||||
|
runtime = toc(tStart);
|
||||||
|
|
||||||
|
% Estimate workspace memory usage
|
||||||
|
try
|
||||||
|
vars = whos;
|
||||||
|
totalBytes = sum([vars.bytes]);
|
||||||
|
workspaceMemoryMB = totalBytes / 1e6;
|
||||||
|
catch
|
||||||
|
workspaceMemoryMB = NaN;
|
||||||
|
end
|
||||||
|
|
||||||
|
% Create stats struct
|
||||||
|
stats.runtime = runtime;
|
||||||
|
stats.workspaceMemoryMB = workspaceMemoryMB;
|
||||||
|
stats.timestamp = datestr(now, 'yyyy-mm-dd_HH-MM-SS');
|
||||||
|
[~, hostname] = system('hostname');
|
||||||
|
stats.hostname = strtrim(hostname);
|
||||||
|
|
||||||
|
% Save as JSON
|
||||||
|
try
|
||||||
|
if ~exist(saveDirectory, 'dir')
|
||||||
|
mkdir(saveDirectory);
|
||||||
|
end
|
||||||
|
filename = fullfile(saveDirectory, ['profiling_stats_', stats.timestamp, '.json']);
|
||||||
|
jsonStr = jsonencode(stats, 'PrettyPrint', true);
|
||||||
|
fid = fopen(filename, 'w');
|
||||||
|
fwrite(fid, jsonStr, 'char');
|
||||||
|
fclose(fid);
|
||||||
|
catch ME
|
||||||
|
warning('Failed to save profiling stats: %s', ME.message);
|
||||||
|
end
|
||||||
|
|
||||||
|
% Return stats
|
||||||
|
varargout{nOutputs + 1} = stats;
|
||||||
|
end
|
@ -3,7 +3,7 @@
|
|||||||
% Important: Run only sectionwise!!
|
% Important: Run only sectionwise!!
|
||||||
|
|
||||||
%% - Create Simulator, Potential and Calculator object with specified options
|
%% - Create Simulator, Potential and Calculator object with specified options
|
||||||
% - Imaginary-Time
|
|
||||||
OptionsStruct = struct;
|
OptionsStruct = struct;
|
||||||
|
|
||||||
OptionsStruct.NumberOfAtoms = 40000;
|
OptionsStruct.NumberOfAtoms = 40000;
|
||||||
@ -19,11 +19,11 @@ OptionsStruct.Dimensions = [30, 20, 20];
|
|||||||
OptionsStruct.UseApproximationForLHY = true;
|
OptionsStruct.UseApproximationForLHY = true;
|
||||||
OptionsStruct.IncludeDDICutOff = true;
|
OptionsStruct.IncludeDDICutOff = true;
|
||||||
OptionsStruct.CutoffType = 'Cylindrical';
|
OptionsStruct.CutoffType = 'Cylindrical';
|
||||||
OptionsStruct.SimulationMode = 'EnergyMinimization'; % 'ImaginaryTimeEvolution' | 'RealTimeEvolution' | 'EnergyMinimization'
|
OptionsStruct.SimulationMode = 'EnergyMinimization'; % 'ImaginaryTimeEvolution' | 'RealTimeEvolution' | 'EnergyMinimization'
|
||||||
OptionsStruct.GradientDescentMethod = 'HeavyBall'; % 'HeavyBall' | 'NonLinearCGD'
|
OptionsStruct.GradientDescentMethod = 'HeavyBall'; % 'HeavyBall' | 'NonLinearCGD'
|
||||||
OptionsStruct.MaxIterationsForGD = 2E5;
|
OptionsStruct.MaxIterationsForGD = 1000;
|
||||||
OptionsStruct.TimeStepSize = 1E-4; % in s
|
OptionsStruct.TimeStepSize = 1E-3; % in s
|
||||||
OptionsStruct.MinimumTimeStepSize = 2E-10; % in s
|
OptionsStruct.MinimumTimeStepSize = 1E-6; % in s
|
||||||
OptionsStruct.TimeCutOff = 2E6; % in s
|
OptionsStruct.TimeCutOff = 2E6; % in s
|
||||||
OptionsStruct.EnergyTolerance = 5E-10;
|
OptionsStruct.EnergyTolerance = 5E-10;
|
||||||
OptionsStruct.ResidualTolerance = 1E-08;
|
OptionsStruct.ResidualTolerance = 1E-08;
|
||||||
@ -33,16 +33,18 @@ OptionsStruct.PlotLive = true;
|
|||||||
OptionsStruct.JobNumber = 0;
|
OptionsStruct.JobNumber = 0;
|
||||||
OptionsStruct.RunOnGPU = false;
|
OptionsStruct.RunOnGPU = false;
|
||||||
OptionsStruct.SaveData = true;
|
OptionsStruct.SaveData = true;
|
||||||
OptionsStruct.SaveDirectory = './Results/Data_3D/GradientDescent';
|
OptionsStruct.SaveDirectory = './Results/Data_3D/GradientDescent'; % './Results/Data_3D/AnisotropicTrap/Tilted0'
|
||||||
options = Helper.convertstruct2cell(OptionsStruct);
|
options = Helper.convertstruct2cell(OptionsStruct);
|
||||||
clear OptionsStruct
|
|
||||||
|
|
||||||
sim = Simulator.DipolarGas(options{:});
|
sim = Simulator.DipolarGas(options{:});
|
||||||
pot = Simulator.Potentials(options{:});
|
pot = Simulator.Potentials(options{:});
|
||||||
sim.Potential = pot.trap(); % + pot.repulsive_chopstick();
|
sim.Potential = pot.trap(); % + pot.repulsive_chopstick();
|
||||||
|
|
||||||
%-% Run Simulation %-%
|
%-% Run Simulation %-%
|
||||||
[Params, Transf, psi, V, VDk] = sim.run();
|
NumberOfOutputs = 5;
|
||||||
|
[Params, Transf, psi, V, VDk, stats] = Helper.runWithProfiling(@() sim.run(), NumberOfOutputs, OptionsStruct.SaveDirectory);
|
||||||
|
fprintf('Runtime: %.3f seconds\n', stats.runtime);
|
||||||
|
fprintf('Memory used: %.2f MB\n', stats.workspaceMemoryMB);
|
||||||
|
|
||||||
%% - Plot numerical grid
|
%% - Plot numerical grid
|
||||||
% Plotter.visualizeSpace(Transf)
|
% Plotter.visualizeSpace(Transf)
|
||||||
|
@ -5,8 +5,9 @@
|
|||||||
# Request number of nodes and GPU for job
|
# Request number of nodes and GPU for job
|
||||||
#SBATCH --nodes=1
|
#SBATCH --nodes=1
|
||||||
#SBATCH --ntasks-per-node=1
|
#SBATCH --ntasks-per-node=1
|
||||||
#SBATCH --gres=gpu:A40:1
|
#SBATCH --cpus-per-task=4
|
||||||
#SBATCH --mem=2G
|
#SBATCH --gres=gpu:1
|
||||||
|
#SBATCH --mem=12G
|
||||||
# Estimated wallclock time for job
|
# Estimated wallclock time for job
|
||||||
#SBATCH --time=03:00:00
|
#SBATCH --time=03:00:00
|
||||||
#SBATCH --job-name=simulation
|
#SBATCH --job-name=simulation
|
||||||
|
Loading…
Reference in New Issue
Block a user