Matrix Multiplication Using Parallel Computing in Matlab, with multithreadingMarch 5, 2021 / Lorand Gabriel Parajdi
► Save the following lines of code in a file called matrix_multiplication.m, then run it using Matlab. ► Instead of using Matlab matrix multiplication (C = A * B), we have defined matrix multiplication using multiple for loops. Matlab linear algebra library, used in A*B, is already parallelized, and we want to implement parallelization by ourselves.
clear all; clc;
nthreads = [ 4 ];
%nthreads = [ 1, 2, 3, 4, 8, 12 ];
% set the size
sizes = [ 1000 ];
%sizes = [ 100 500 1000 ];
for s=1:length(sizes)
n = sizes(s); % set the matrix size
A = rand(n); % create random matrix
B = rand(n); % create another random matrix
for l=1:length(nthreads) % vector implementation (may trigger multithreading)
nt=nthreads(l);
lastnt=maxNumCompThreads(nt); % set the thread count
parpool('threads')
C = zeros(n);
tic % starts timer
parfor i = 1:n % matrix multiplication algorithm
for j = 1:n
sum = 0;
for k = 1:n
sum = sum + A(i,k) * B(k,j);
end
C(i,j) = sum;
end
end
walltime(l) = toc; % wall clock time
Speedup = walltime(1)/walltime(l);
Efficiency = 100*Speedup/nt;
printstring=sprintf(['size=%d time=%8.4f threads=%2d speedup=%4.1f efficiency=%5.1f%%'],
n, walltime(l), nt, Speedup, Efficiency);
disp(printstring);
par = gcp('nocreate'); % release pool instance
delete(par);
end
disp(' '); % to display matrix C --> disp(C);
end
plot(nthreads,walltime) % plot of running time and no. of threads
hold on
plot(nthreads,walltime,'.','MarkerSize',25)
xlabel('No. of threads');
ylabel('Running time')
grid on
hold offMatrix Multiplication on the CPU v.s. GPU in MatlabMarch 3, 2021 / Lorand Gabriel Parajdi
► Save the following lines of code in a file called matrix_multip_cpu_vs_gpu.m, then run it using Matlab.
clear all; clc;
v1 = 10:10:90; % set the matrix size
v2 = 100:100:900;
v3 = 1000:1000:9000;
v = [v1 v2 v3];
%v = [v1 v2];
% CPU computations
for i = 1:length(v)
A = rand(v(i)); % create random matrix
B = rand(v(i)); % create another random matrix
f_cpu = @() bsxfun(@mtimes, A, B);
t(i) = timeit(f_cpu);
disp(strcat( 'CPU matrix_dimension: ', num2str(v(i)), ' time: ', num2str(t(i))))
end
% GPU computations
for i = 1:length(v)
AA = rand(v(i),'gpuArray'); % create random matrix
BB = rand(v(i),'gpuArray'); % create another random matrix
f_gpu = @() bsxfun(@mtimes, AA, BB);
tt(i) = gputimeit(f_gpu);
disp(strcat( 'GPU matrix_dimension: ', num2str(v(i)), ' time: ', num2str(tt(i))))
end
save cpu_gpu.mat v t tt % save the data values of v, t and tt
% in the file named: cpu_gpu.mat
loglog(v, t, 'b')
hold on
loglog(v, tt, 'r')
loglog(v, t, 'b.', 'MarkerSize', 20)
loglog(v, tt, 'r.', 'MarkerSize', 20)
grid on
xlabel('Log(Matrix size)')
ylabel('Execution time')
legend('CPU', 'GPU')
hold off