pad_im = rand(dim1, dim2, dim3);
index_object = cell(1, 10);
index_object{i} = [randi([1, dim1-sz_block(1)+1], 1, 3);
randi([1, dim2-sz_block(2)+1], 1, 3);
randi([1, dim3-sz_block(3)+1], 1, 3)];
out = zeros(1, numel(index_object));
parfor n = 1:numel(index_object)
block_im = pad_im(index_object{n}(1,1):index_object{n}(1,1)+sz_block(1)-1, ...
index_object{n}(2,1):index_object{n}(2,1)+sz_block(2)-1, ...
index_object{n}(3,1):index_object{n}(3,1)+sz_block(3)-1);
out(n) = sum(block_im(:));
fprintf('Elapsed time for block processing: %.2f seconds\n', elapsedTime);
if ~license('test', 'Distrib_Computing_Toolbox')
error('Parallel Computing Toolbox is required for distributed arrays.');
pad_im = distributed.rand(dim1, dim2, dim3);
out = zeros(1, num_blocks);
index_object = cell(1, num_blocks);
index_object{i} = [randi([1, dim1 - sz_block(1) + 1]);
randi([1, dim2 - sz_block(2) + 1]);
randi([1, dim3 - sz_block(3) + 1])];
local_pad_im = getLocalPart(pad_im);
local_size = size(local_pad_im);
local_out = zeros(1, num_blocks);
global_start_idx1 = globalIndices(pad_im, 1);
global_start_idx2 = globalIndices(pad_im, 2);
global_start_idx3 = globalIndices(pad_im, 3);
global_idx1 = index_object{n}(1);
global_idx2 = index_object{n}(2);
global_idx3 = index_object{n}(3);
local_idx1 = global_idx1 - global_start_idx1(1) + 1;
local_idx2 = global_idx2 - global_start_idx2(1) + 1;
local_idx3 = global_idx3 - global_start_idx3(1) + 1;
if local_idx1 > 0 && local_idx1 + sz_block(1) - 1 <= local_size(1) && ...
local_idx2 > 0 && local_idx2 + sz_block(2) - 1 <= local_size(2) && ...
local_idx3 > 0 && local_idx3 + sz_block(3) - 1 <= local_size(3)
block_im = local_pad_im(local_idx1:local_idx1+sz_block(1)-1, ...
local_idx2:local_idx2+sz_block(2)-1, ...
local_idx3:local_idx3+sz_block(3)-1);
local_out(n) = sum(block_im(:));
out = spmdPlus(local_out);
fprintf('Elapsed time for block processing: %.2f seconds\n', elapsedTime);