From 18fd4f141736a9d56a86789ef079a1f472a67e50 Mon Sep 17 00:00:00 2001 From: Nicola Vigano <nicola.vigano@esrf.fr> Date: Tue, 12 Feb 2013 16:59:15 +0100 Subject: [PATCH] Astra: updated benchmarks against new cell interface Signed-off-by: Nicola Vigano <nicola.vigano@esrf.fr> --- zUtil_DataStructures/GtAstraBenchmarks.m | 314 +++++++++++++++++++++-- zUtil_DataStructures/GtBenchmarks.m | 3 +- 2 files changed, 288 insertions(+), 29 deletions(-) diff --git a/zUtil_DataStructures/GtAstraBenchmarks.m b/zUtil_DataStructures/GtAstraBenchmarks.m index 76cadf9c..6a40f50c 100644 --- a/zUtil_DataStructures/GtAstraBenchmarks.m +++ b/zUtil_DataStructures/GtAstraBenchmarks.m @@ -1,21 +1,11 @@ classdef GtAstraBenchmarks < GtBenchmarks methods (Access = public, Static) - function benchmark3Dset(numIters, sirtDetectImages) - if (~exist('numIters', 'var')) - numIters = 20; - end - if (~exist('sirtDetectImages', 'var')) - sirtDetectImages = rand(1e2, 2e2, 3e2); - end - proj = []; - proj.stack = sirtDetectImages; - proj.num_cols = size(sirtDetectImages, 1); - proj.num_rows = size(sirtDetectImages, 3); - proj.geom = ones(size(sirtDetectImages, 2), 12); - proj_geom = astra_create_proj_geom('parallel3d_vec', proj.num_rows, proj.num_cols, proj.geom); + %%% SINO + function benchmark3Dcreate(numIters, sirtDetectImages) + [proj, proj_geom] = GtAstraBenchmarks.createProjAndGeom(sirtDetectImages); bytes = GtBenchmarks.getSizeVariable(sirtDetectImages); - GtBenchmarks.printHeader('Set Mex Data 3D', bytes) + GtBenchmarks.printHeader('Create Mex Data 3D', bytes) fprintf(' - Doing %d iterations: ', numIters) tic(); @@ -26,7 +16,28 @@ classdef GtAstraBenchmarks < GtBenchmarks GtBenchmarks.printResult('astra_mex_data3d(''create'', ''-proj3d'')', toc()/numIters, bytes); % Let's assume 'get' is correct! - proj_id = astra_mex_data3d('create', '-proj3d', proj_geom, proj.stack); + proj_id = astra_mex_data3d('create', '-proj3d', proj_geom, proj.stack); + copied = astra_mex_data3d('get', proj_id); + astra_mex_data3d('delete', proj_id); + + GtBenchmarks.verifyError(sirtDetectImages, copied); + end + + function benchmark3Dstore(numIters, sirtDetectImages) + [proj, proj_geom] = GtAstraBenchmarks.createProjAndGeom(sirtDetectImages); + + bytes = GtBenchmarks.getSizeVariable(sirtDetectImages); + GtBenchmarks.printHeader('Store Mex Data 3D', bytes) + fprintf(' - Doing %d iterations: ', numIters) + + proj_id = astra_mex_data3d('create', '-proj3d', proj_geom, proj.stack); + tic(); + for ii = 1:numIters + astra_mex_data3d('store', proj_id, proj.stack); + end + GtBenchmarks.printResult('astra_mex_data3d(''store'', ''-proj3d'')', toc()/numIters, bytes); + + % Let's assume 'get' is correct! copied = astra_mex_data3d('get', proj_id); astra_mex_data3d('delete', proj_id); @@ -34,23 +45,72 @@ classdef GtAstraBenchmarks < GtBenchmarks end function benchmark3Dget(numIters, sirtDetectImages) - if (~exist('numIters', 'var')) - numIters = 20; + [proj, proj_geom] = GtAstraBenchmarks.createProjAndGeom(sirtDetectImages); + + bytes = GtBenchmarks.getSizeVariable(sirtDetectImages); + GtBenchmarks.printHeader('Get Mex Data 3D', bytes) + fprintf(' - Doing %d iterations: ', numIters) + proj_id = astra_mex_data3d('create', '-proj3d', proj_geom, proj.stack); + + tic(); + for ii = 1:numIters + proj = astra_mex_data3d('get', proj_id); end - if (~exist('sirtDetectImages', 'var')) - sirtDetectImages = rand(1e2, 2e2, 3e2); + astra_mex_data3d('delete', proj_id); + GtBenchmarks.printResult('astra_mex_data3d(''get'', proj_id)', toc()/numIters, bytes); + end + + %%% VOL + function benchmarkVolCreate(numIters, sirtDetectImages) + vol_geom = GtAstraBenchmarks.createVolAndGeom(sirtDetectImages); + + bytes = GtBenchmarks.getSizeVariable(sirtDetectImages); + GtBenchmarks.printHeader('Create Mex Data 3D', bytes) + fprintf(' - Doing %d iterations: ', numIters) + + tic(); + for ii = 1:numIters + proj_id = astra_mex_data3d('create', '-vol', vol_geom, sirtDetectImages); + astra_mex_data3d('delete', proj_id); end - proj = []; - proj.stack = sirtDetectImages; - proj.num_cols = size(sirtDetectImages, 1); - proj.num_rows = size(sirtDetectImages, 3); - proj.geom = ones(size(sirtDetectImages, 2), 12); - proj_geom = astra_create_proj_geom('parallel3d_vec', proj.num_rows, proj.num_cols, proj.geom); + GtBenchmarks.printResult('astra_mex_data3d(''create'', ''-vol'')', toc()/numIters, bytes); + + % Let's assume 'get' is correct! + proj_id = astra_mex_data3d('create', '-vol', vol_geom, sirtDetectImages); + copied = astra_mex_data3d('get', proj_id); + astra_mex_data3d('delete', proj_id); + + GtBenchmarks.verifyError(sirtDetectImages, copied); + end + + function benchmarkVolStore(numIters, sirtDetectImages) + vol_geom = GtAstraBenchmarks.createVolAndGeom(sirtDetectImages); + + bytes = GtBenchmarks.getSizeVariable(sirtDetectImages); + GtBenchmarks.printHeader('Store Mex Data 3D', bytes) + fprintf(' - Doing %d iterations: ', numIters) + + proj_id = astra_mex_data3d('create', '-vol', vol_geom); + tic(); + for ii = 1:numIters + astra_mex_data3d('store', proj_id, sirtDetectImages); + end + GtBenchmarks.printResult('astra_mex_data3d(''store'', ''-vol'')', toc()/numIters, bytes); + + % Let's assume 'get' is correct! + copied = astra_mex_data3d('get', proj_id); + astra_mex_data3d('delete', proj_id); + + GtBenchmarks.verifyError(sirtDetectImages, copied); + end + + function benchmarkVolGet(numIters, sirtDetectImages) + vol_geom = GtAstraBenchmarks.createVolAndGeom(sirtDetectImages); bytes = GtBenchmarks.getSizeVariable(sirtDetectImages); GtBenchmarks.printHeader('Get Mex Data 3D', bytes) fprintf(' - Doing %d iterations: ', numIters) - proj_id = astra_mex_data3d('create', '-proj3d', proj_geom, proj.stack); + proj_id = astra_mex_data3d('create', '-vol', vol_geom, sirtDetectImages); tic(); for ii = 1:numIters @@ -60,11 +120,209 @@ classdef GtAstraBenchmarks < GtBenchmarks GtBenchmarks.printResult('astra_mex_data3d(''get'', proj_id)', toc()/numIters, bytes); end + %%% CELL SINO + function benchmarkCellCreate(numIters, detectImages, numCells) + proj = cell(1, numCells); + proj_geom = cell(1, numCells); + for n = 1:numCells + [proj{n}, proj_geom{n}] = GtAstraBenchmarks.createProjAndGeom(detectImages); + end + proj_stack = cell(1, numCells); + for n = 1:numCells + proj_stack{n} = proj{n}.stack; + end + + bytes = numCells * GtBenchmarks.getSizeVariable(detectImages); + GtBenchmarks.printHeader('Create Mex Data Cell', bytes) + fprintf(' - Doing %d iterations: ', numIters) + + tic(); + for ii = 1:numIters + proj_id = astra_mex_data3d('create', '-proj3d', proj_geom, proj_stack); + astra_mex_data3d('delete', proj_id{:}); + end + GtBenchmarks.printResult('astra_mex_data3d(''create'', ''-proj3d'')', toc()/numIters, bytes); + + % Let's assume 'get' is correct! + proj_id = astra_mex_data3d('create', '-proj3d', proj_geom, proj_stack); + copied = astra_mex_data3d('get', proj_id); + astra_mex_data3d('delete', proj_id{:}); + + GtBenchmarks.verifyError(proj_stack, copied); + end + + function benchmarkCellStore(numIters, detectImages, numCells) + proj = cell(1, numCells); + proj_geom = cell(1, numCells); + for n = 1:numCells + [proj{n}, proj_geom{n}] = GtAstraBenchmarks.createProjAndGeom(detectImages); + end + proj_stack = cell(1, numCells); + for n = 1:numCells + proj_stack{n} = proj{n}.stack; + end + + bytes = numCells * GtBenchmarks.getSizeVariable(detectImages); + GtBenchmarks.printHeader('Store Mex Data Cell', bytes) + fprintf(' - Doing %d iterations: ', numIters) + + proj_id = astra_mex_data3d('create', '-proj3d', proj_geom, proj_stack); + tic(); + for ii = 1:numIters + astra_mex_data3d('store', proj_id, proj_stack); + end + GtBenchmarks.printResult('astra_mex_data3d(''store'', ''-proj3d'')', toc()/numIters, bytes); + + % Let's assume 'get' is correct! + copied = astra_mex_data3d('get', proj_id); + astra_mex_data3d('delete', proj_id{:}); + + GtBenchmarks.verifyError(proj_stack, copied); + end + + function benchmarkCellGet(numIters, detectImages, numCells) + proj = cell(1, numCells); + proj_geom = cell(1, numCells); + for n = 1:numCells + [proj{n}, proj_geom{n}] = GtAstraBenchmarks.createProjAndGeom(detectImages); + end + proj_stack = cell(1, numCells); + for n = 1:numCells + proj_stack{n} = proj{n}.stack; + end + + bytes = numCells * GtBenchmarks.getSizeVariable(detectImages); + GtBenchmarks.printHeader('Get Mex Data Cell', bytes) + fprintf(' - Doing %d iterations: ', numIters) + proj_id = astra_mex_data3d('create', '-proj3d', proj_geom, proj_stack); + + tic(); + for ii = 1:numIters + proj = astra_mex_data3d('get', proj_id); + end + GtBenchmarks.printResult('astra_mex_data3d(''get'', proj_id)', toc()/numIters, bytes); + astra_mex_data3d('delete', proj_id{:}); + end + + %%% CELL VOL + function benchmarkCellVolCreate(numIters, detectImages, numCells) + vol_geom = cell(1, numCells); + for n = 1:numCells + vol_geom{n} = GtAstraBenchmarks.createVolAndGeom(detectImages); + end + vol_stack = cell(1, numCells); + for n = 1:numCells + vol_stack{n} = detectImages; + end + + bytes = numCells * GtBenchmarks.getSizeVariable(detectImages); + GtBenchmarks.printHeader('Create Mex Data Cell', bytes) + fprintf(' - Doing %d iterations: ', numIters) + + tic(); + for ii = 1:numIters + proj_id = astra_mex_data3d('create', '-vol', vol_geom, vol_stack); + astra_mex_data3d('delete', proj_id{:}); + end + GtBenchmarks.printResult('astra_mex_data3d(''create'', ''-vol'')', toc()/numIters, bytes); + + % Let's assume 'get' is correct! + proj_id = astra_mex_data3d('create', '-vol', vol_geom, vol_stack); + copied = astra_mex_data3d('get', proj_id); + astra_mex_data3d('delete', proj_id{:}); + + GtBenchmarks.verifyError(vol_stack, copied); + end + + function benchmarkCellVolStore(numIters, detectImages, numCells) + vol_geom = cell(1, numCells); + for n = 1:numCells + vol_geom{n} = GtAstraBenchmarks.createVolAndGeom(detectImages); + end + vol_stack = cell(1, numCells); + for n = 1:numCells + vol_stack{n} = detectImages; + end + + bytes = numCells * GtBenchmarks.getSizeVariable(detectImages); + GtBenchmarks.printHeader('Store Mex Data Cell', bytes) + fprintf(' - Doing %d iterations: ', numIters) + + proj_id = astra_mex_data3d('create', '-vol', vol_geom); + tic(); + for ii = 1:numIters + astra_mex_data3d('store', proj_id, vol_stack); + end + GtBenchmarks.printResult('astra_mex_data3d(''store'', ''-vol'')', toc()/numIters, bytes); + + % Let's assume 'get' is correct! + copied = astra_mex_data3d('get', proj_id); + astra_mex_data3d('delete', proj_id{:}); + + GtBenchmarks.verifyError(vol_stack, copied); + end + + function benchmarkCellVolGet(numIters, detectImages, numCells) + vol_geom = cell(1, numCells); + for n = 1:numCells + vol_geom{n} = GtAstraBenchmarks.createVolAndGeom(detectImages); + end + vol_stack = cell(1, numCells); + for n = 1:numCells + vol_stack{n} = detectImages; + end + + bytes = numCells * GtBenchmarks.getSizeVariable(detectImages); + GtBenchmarks.printHeader('Get Mex Data Cell', bytes) + fprintf(' - Doing %d iterations: ', numIters) + proj_id = astra_mex_data3d('create', '-vol', vol_geom, vol_stack); + + tic(); + for ii = 1:numIters + proj = astra_mex_data3d('get', proj_id); + end + GtBenchmarks.printResult('astra_mex_data3d(''get'', proj_id)', toc()/numIters, bytes); + astra_mex_data3d('delete', proj_id{:}); + end + function allBenchmarks() - imgs = rand(5e2, 5e2, 5e2); + imgs = rand(1e3, 1e3, 1e2); - GtAstraBenchmarks.benchmark3Dset(5, imgs) + GtAstraBenchmarks.benchmark3Dcreate(5, imgs) + GtAstraBenchmarks.benchmark3Dstore(5, imgs) GtAstraBenchmarks.benchmark3Dget(5, imgs) + + GtAstraBenchmarks.benchmarkVolCreate(5, imgs) + GtAstraBenchmarks.benchmarkVolStore(5, imgs) + GtAstraBenchmarks.benchmarkVolGet(5, imgs) + + imgs = rand(1e3, 1e3, 2e1); + + GtAstraBenchmarks.benchmarkCellCreate(5, imgs, 5); + GtAstraBenchmarks.benchmarkCellStore(5, imgs, 5); + GtAstraBenchmarks.benchmarkCellGet(5, imgs, 5); + + GtAstraBenchmarks.benchmarkCellVolCreate(5, imgs, 5); + GtAstraBenchmarks.benchmarkCellVolStore(5, imgs, 5); + GtAstraBenchmarks.benchmarkCellVolGet(5, imgs, 5); + + % Just in case + astra_mex_data3d('clear'); + end + end + + methods (Access = protected, Static) + function [proj, proj_geom] = createProjAndGeom(detectImages) + proj = []; + proj.stack = detectImages; + proj.num_cols = size(detectImages, 1); + proj.num_rows = size(detectImages, 3); + proj.geom = ones(size(detectImages, 2), 12); + proj_geom = astra_create_proj_geom('parallel3d_vec', proj.num_rows, proj.num_cols, proj.geom); + end + + function vol_geom = createVolAndGeom(detectImages) + vol_geom = astra_create_vol_geom(size(detectImages, 1), size(detectImages, 2), size(detectImages, 3)); end end end diff --git a/zUtil_DataStructures/GtBenchmarks.m b/zUtil_DataStructures/GtBenchmarks.m index b1966bdc..4715b1f2 100644 --- a/zUtil_DataStructures/GtBenchmarks.m +++ b/zUtil_DataStructures/GtBenchmarks.m @@ -19,7 +19,8 @@ classdef GtBenchmarks function verifyError(reference, computed) fprintf('Checking errors in computation:\n') if (iscell(reference)) - fprintf('\t%g\n', max(cellfun(@(x, y)max(max(max(abs(x - y)))), reference, computed))); + fprintf('\t%g\n', max(cellfun(@(x, y)max(max(max(abs(x - y)))), ... + reshape(reference, [numel(reference), 1]), reshape(computed, [numel(computed), 1]) )) ); elseif (isscalar(reference)) fprintf('\t%g (%g relative)\n', abs(reference - computed), abs((reference - computed)/reference) ); else -- GitLab