Code covered by the BSD License  

Highlights from
NVIDIA CUDA-based bilinear (2D) interpolation

image thumbnail
from NVIDIA CUDA-based bilinear (2D) interpolation by Gerald Buchgraber
Incredible speed boost in comparison to the Matlab implementation. (interp2)

bilininterp_speed_test.m
%----------------------------------------------------
% SPEED TEST
%----------------------------------------------------
% Gerald Buchgraber, 2009
% gerald.buchgraber@student.tugraz.at
% 
% Build bilininterp mex file first
% (using build_mex.m)
%----------------------------------------------------

close all; clear all; clc;

%----------------------------------------------------
% C O N F I G
%----------------------------------------------------
basic_grid_elements_x = 256;
basic_grid_elements_y = 256;

test_trajectories = round(linspace(1, 10000, 10));
samples_on_each_trajectory = 300;
num_avg_repeats = 5;
%----------------------------------------------------

bilininterp_results = zeros(1, numel(test_trajectories));
interp2_results = zeros(1, numel(test_trajectories));

for i = 1:numel(test_trajectories)
    numSpokes = test_trajectories(i);
    numSamplesOnSpoke = samples_on_each_trajectory;

    theta = 0:pi/numSpokes:pi-pi/numSpokes;
    rho = linspace(-0.5, 0.5, numSamplesOnSpoke)';

    b = zeros(numSamplesOnSpoke, numSpokes);
    for ii = 1:length(theta)
        b(:,ii) = rho*exp(-j*theta(ii));
    end
    clear theta;

    XI = real(b);
    YI = imag(b);

    fx = round(basic_grid_elements_x / 3);
    fy = round(basic_grid_elements_y / 3);
    [X, Y] = meshgrid(1:1:3*fx, 1:1:3*fy);
    Z = peaks(2*X/fx-3, 2*Y/fy-3);

    XI = (XI + .5) * (max(max(X))-1) + 1;
    YI = (YI + .5) * (max(max(Y))-1) + 1;
    
    XI = sort(XI(:));
    YI = sort(YI(:));
    
    bilininterp_temp = zeros(1, num_avg_repeats);
    interp2_temp = zeros(1, num_avg_repeats);
    for t = 1:num_avg_repeats
        %----------------------------------------------------
        % BILININTERP
        %----------------------------------------------------
        tic;
        ZBI = bilininterp(Z, XI, YI);
        bilininterp_temp(t) = toc;
        clear ZBI;
    end
    for t = 1:num_avg_repeats
        %----------------------------------------------------
        % INTERP2
        %----------------------------------------------------
        tic;
        ZII = interp2(Z, XI, YI, '*linear');
		interp2_temp(t) = toc;
        clear ZII;
    end
    bilininterp_results(i) = mean(bilininterp_temp);
    interp2_results(i) = mean(interp2_temp);
    clc; disp(['Progress: ', num2str(i / numel(test_trajectories) * 100), '%']);
end

% Visualize results
%----------------------------------------------------
figure;
samples = test_trajectories * samples_on_each_trajectory;
plot(samples, bilininterp_results, 'r-*', samples, interp2_results, 'g-*');
title('Speed Test Results');
xlabel('# of interpolated samples');
ylabel('Time [s]');
legend('Bilinear Interpolation based on CUDA', 'Matlab function: interp2', 'Location', 'NorthWest');

% Speedup
%----------------------------------------------------
speedup = interp2_results ./ bilininterp_results;
nsize = samples;
figure;
plot(nsize, speedup, '-*');
title('SPEEDUP - bilininterp vs. interp2');
xlabel('# of interpolated samples');
ylabel('Speedup: t_{CPU} / t_{GPU}');

Contact us at files@mathworks.com