vectorización de meshgrid
y ndgrid
Si usted todavía está interesado en encontrar una aplicación vectorizado para hacer que el código basado en meshgrid
el problema más rápido, permítame sugerirle un método vectorizado con bsxfun
y es portado versión de la GPU. Creo firmemente que las personas deben considerar vectorization with GPUs
como una opción prometedora para acelerar los códigos MATLAB
. Los códigos que emplean meshgrid
o ndgrid
y cuyas salidas se deben operar con alguna operación de elemento configuran un terreno perfecto para emplear bsxfun
en esos códigos. Para agregar a eso, el uso de GPU con bsxfun
, que le permite trabajar en los elementos de forma independiente con cientos y miles de núcleos CUDA disponibles, lo hace perfecto para la implementación de GPU.
Para su problema específico, las entradas eran -
x = -2:0.01:2;
y = -2:0.01:2;
A continuación, tenías -
[xx,yy] = meshgrid(x,y);
z = sin(xx.^2-yy.^2);
Con bsxfun
, esto se convierte en una sola línea -
z = sin(bsxfun(@minus,x.^2,y.^2.'));
Benchmarking
GPU puntos de referencia se tomaron desde Measure and Improve GPU Performance.
%// Warm up GPU call with insignificant small scalar inputs
temp1 = sin_sqdiff_vect2(0,0);
N_arr = [50 100 200 500 1000 2000 3000]; %// array elements for N (datasize)
timeall = zeros(3,numel(N_arr));
for k = 1:numel(N_arr)
N = N_arr(k);
x = linspace(-20,20,N);
y = linspace(-20,20,N);
f = @() sin_sqdiff_org(x,y);%// Original CPU code
timeall(1,k) = timeit(f);
clear f
f = @() sin_sqdiff_vect1(x,y);%// Vectorized CPU code
timeall(2,k) = timeit(f);
clear f
f = @() sin_sqdiff_vect2(x,y);%// Vectorized GPU(GTX 750Ti) code
timeall(3,k) = gputimeit(f);
clear f
end
%// Display benchmark results
figure,hold on, grid on
plot(N_arr,timeall(1,:),'-b.')
plot(N_arr,timeall(2,:),'-ro')
plot(N_arr,timeall(3,:),'-kx')
legend('Original CPU','Vectorized CPU','Vectorized GPU (GTX 750 Ti)')
xlabel('Datasize (N) ->'),ylabel('Time(sec) ->')
funciones asociadas
%// Original code
function z = sin_sqdiff_org(x,y)
[xx,yy] = meshgrid(x,y);
z = sin(xx.^2-yy.^2);
return;
%// Vectorized CPU code
function z = sin_sqdiff_vect1(x,y)
z = sin(bsxfun(@minus,x.^2,y.^2.')); %//'
return;
%// Vectorized GPU code
function z = sin_sqdiff_vect2(x,y)
gx = gpuArray(x);
gy = gpuArray(y);
gz = sin(bsxfun(@minus,gx.^2,gy.^2.')); %//'
z = gather(gz);
return;
Resultados
Conclusiones
Como muestran los resultados, el método vectorizado con GPU muestra un buen rendimiento imp rovement que es aproximadamente 4.3x
contra el código CPU vectorizado y 6x
contra el código original. Tenga en cuenta que GPU tiene que superar una sobrecarga mínima que se requiere con su configuración, por lo que se necesita al menos una entrada de tamaño decente para ver la mejora. Con suerte, la gente exploraría más de vectorization with GPUs
, ¡ya que no se podría enfatizar lo suficiente!
Eche un vistazo a la implementación 'bsxfun', que también se refiere al uso de GPU [aquí] (http://stackoverflow.com/a/25162350/3293881) – Divakar