Matlab has incorporated GPU processing on the parallel computing toolbox and you can create GPU array objects using the gpuArray(…) function in MATLAB. I created a brief script to compare matrix multiply of a 2048 x 2048 matrix against a vector. Ordinarily, the CPU operations see reasonable speedup (~2x) from moving from double to single precision values. However, moving to the GPU implementation results in a speedup of 6.8x for Double and 5.6x for Single! This means that if you can take a matrix-vector multiply that is double precision and convert it to single precision GPU version, you may see a gain of nearly 14x.
The following we generated in Matlab R2014b on an i7-4770 3.5 Ghz CPU (8 CPUs) with 16GB Ram and a Geforce GTX 750.
The next step is to evaluate speed of the gpuArray on a basic L1 Optimization set—l1 magic.
The code used to generate this data is as follows:
allTypes = {'Double', 'gpuArrayDouble', 'Single', 'gpuArraySingle'}; allTimes = nan(length(allTypes),1); n = 2048; % size of operation for Ax num_mc = 2^10; % number monte carlo runs to compute time average of runs randn('seed', 1982); Am = randn(n,n); xm = randn(n,1); for ind_type = 1:length(allTypes) myType = allTypes{ind_type}; switch lower(myType) case 'double' A = double(Am); x = double(xm); case 'single' A = single(Am); x = single(xm); case 'gpuarraydouble' A = gpuArray(Am); x = gpuArray(xm); case 'gpuarraysingle' A = gpuArray(single(Am)); x = gpuArray(single(xm)); otherwise error('Unknown type'); end tic for ind_mc = 1:num_mc y = A*x; end allTimes(ind_type) = toc/num_mc; end %% Display the results figure(34); clf; bar(allTimes*1000); set(gca, 'xticklabel', allTypes, 'color', [1 1 1]*.97); title(['Timing of CPU and GPU in M' version('-release')]); xlabel('Type'); ylabel('Time (ms)'); grid on %% figure(35); clf; speedupLabels = {('Double to Single') , ... ('Double to gpuDouble'), ... ('Single to gpuSingle'), ... 'Double to gpuSingle'}; bar([allTimes(1)/allTimes(3), allTimes(1)/allTimes(2), ... allTimes(3)/allTimes(4), allTimes(1)/allTimes(4)]); set(gca, 'xticklabelrotation', 15, 'xticklabel', speedupLabels, 'color', [1 1 1]*.97); title(['Speedup of CPU and GPU in M' version('-release')]); xlabel('Type'); ylabel('Speedup'); grid on