bản vẽ Gia cho meshgrid
và ndgrid
Nếu bạn vẫn còn quan tâm đến việc tìm kiếm một việc thực hiện vectorized để làm cho meshgrid
dựa mã trong vấn đề nhanh hơn, hãy để tôi đề nghị một phương pháp vectorized với bsxfun
và đó là GPU chuyển phiên bản. Tôi thực sự tin rằng mọi người phải xem xét vectorization with GPUs
như một tùy chọn đầy hứa hẹn để tăng tốc độ MATLAB
mã. Mã sử dụng meshgrid
hoặc ndgrid
và kết quả đầu ra của chúng sẽ được vận hành với một số thiết lập hoạt động theo nguyên tố, một nền tảng hoàn hảo để sử dụng bsxfun
vào các mã đó. Để thêm vào đó, việc sử dụng GPU với bsxfun
, cho phép nó hoạt động độc lập với hàng trăm và hàng nghìn lõi CUDA, làm cho nó hoàn hảo cho việc triển khai GPU.
Đối với vấn đề cụ thể của bạn, đầu vào là -
x = -2:0.01:2;
y = -2:0.01:2;
Tiếp theo, bạn có -
[xx,yy] = meshgrid(x,y);
z = sin(xx.^2-yy.^2);
Với bsxfun
, điều này trở thành một lớp lót -
z = sin(bsxfun(@minus,x.^2,y.^2.'));
Điểm chuẩn
Mẹo đo điểm chuẩn GPU được lấy từ 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) ->')
Associated chức năng
%// 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;
Kết quả
Kết luận
Như kết quả cho thấy, phương pháp vectorized với GPU cho thấy imp hiệu suất tốt rovement là khoảng 4.3x
so với mã CPU được vectorized và 6x
so với mã gốc. Hãy ghi nhớ rằng GPU phải vượt qua một chi phí tối thiểu cần thiết với thiết lập của nó, vì vậy ít nhất một đầu vào có kích thước phù hợp là cần thiết để xem cải tiến. Hy vọng rằng, mọi người sẽ khám phá nhiều hơn vectorization with GPUs
, vì nó không thể được nhấn mạnh đủ!
Kiểm tra việc triển khai 'bsxfun' vừa được thêm vào, mà cũng nói về việc sử dụng GPU [ở đây] (http://stackoverflow.com/a/25162350/3293881) – Divakar