:::: MENU ::::
MATLAB

Matlab Vektörizasyon ile Hızlanma

Matlab Vektörizasyon uyumlu çalışma yapısı ile for döngülerinin gereksiz yere kullanımını önler. Aşağıdaki kodlar incelendiği zaman durum daha net anlaşılacaktır.


clear all;
tic
A = 0:0.000001:10;
B = 0:0.000001:10;
Z = zeros(size(A));
y = 0;
for i = 1:10000001
Z(i) = sin(0.5*A(i)) * exp(B(i)^2);
y = y+Z(i);
end
toc

Bu kod 0.944395 saniyede -1.3042e+48 sonucunu vererek çalışmaktadır.

Aynı sonucu daha hızlı vermesi için vektörizasyon özelliği kullanılabilir.


clear all;
tic
A = 0:0.000001:10;
B = 0:0.000001:10;
Z = zeros(size(A));
y = 0;
y =sin(0.5*A) * exp(B.^2)';
toc
y

Bu kod 0.330786 saniyede -1.3042e+48 sonucunu vererek çalışmaktadır.


MATLAB GPU CUDA Thread, Block, Grid boyutlarının ayarlanması

Kerneli aşağıdaki şekilde oluşturabiliriz:
k = parallel.gpu.CUDAKernel('test.ptx','test.cu');
Peki bu kaç kere çalıştırılacak?
Bunun ayarlanmasını ise GridSize ve ThreadBlockSize özellikleri ile yapmaktayız.
Örneğin:
k.ThreadBlockSize = [500,1,1];
kodu 500 kere ilgili kernelin çalıştırılacağını belirtir.

GridSize: Blok sayısını belirleyen 3 boyutlu bir vektördür = [a b c] = Varsayılan değeri = [1 1 1]’dir.
ThreadBlockSize: Bloklardaki thread sayısını belirleyen 3 boyutlu bir vektördür = [a b c] = Varsayılan değeri = [1 1 1]’dir.

MaxThreadsPerBlock özelliği ise cihazın kapasitesine göre bir blokta olabilecek maksimum thread sayısını tutmaktadır. Böylece rastgele değerler verilerek programın yanlış çalışması önlenmiş olur.


GPU hesaplamada veri transferinin etkisinin FFT hesaplama ile gösterimi

GPU hesaplamada veri transferinin etkisinin FFT hesaplama ile gösterimi…

GPU hesaplamada kullanılacak verinin CPU’dan GPU’ya aktarılması ek bir zaman maliyeti getirmektedir. Bu da performansı etkilemektedir. Aşağıdaki örnekte bunun etki boyutları araştırılmıştır. Gerekli açıklamalar kodların yanında yorum olarak mevcuttur.

A1 = rand(3000,3000);
tic;
B1 = fft(A1);
time1 = toc;
A2 = gpuArray(A1);
tic;
B2 = fft(A2);
time2 = toc;
speedUp = time1/time2;
disp(speedUp)
% GPU, CPU'dan yaklaşık 3,5 kat daha hızlı işlem yapmıştır.Oluşturma
% süreleri devre dışı bırakılmıştır.
tic;
A3 = gpuArray(A1);
B3 = fft(A3);
B3 = gather(B3);
time3 = toc;
speedUp = time1/time3;
disp(speedUp)
% GPU'da oluşturulan matris CPU'ya getirilmiş ve işlem yaptırılmıştır, 0,2
% hızlanma olmuştur. Buda veri transferinin sıkıntısını ortaya koymaktadır.
tic;
A4 = rand(3000,3000);
B4 = fft(A4);
time4 = toc;
tic;
A5 = rand(3000,3000,'gpuArray');
B5 = fft(A5);
B5 = gather(B5);
time5 = toc;
speedUp = time4/time5;
disp(speedUp);
% CPU'da oluşturulan matris ile yapılan işlem GPU'da oluşturulup CPU'ya
% aktarılan matris ile karşılaştırıldığında 1,5 kat hızlanma olmuştur.
% Görüleceği üzere veri transferi 3,5 kat hızlanmayı 1,5 kata düşürmüştür.


Sayfalar:123456789