:::: MENU ::::
MATLAB

GPU Hesaplamadaki Yetersiz Bellek Hatasının Nedeni ve Çözümü

GPU hesaplama işleminde özellikle büyük boyutlu verilerle çalışırken verinin doğruluğunu kontrol etmemiz gerekmektedir. CPU hesaplamada büyük boyutlu veriler işletim sistemi tarafından belirlenen mevcut bellek boyutuna geldiği zaman otomatik olarak harddisk’te bir takas hafızası(swapping memory) oluşturarak veri doğrulama işini yapmış olur, bu yüzden de CPU’da işlemler daha yavaştır. GPU belleği ile harddist arasında böyle bir takas hafızası otomatik olarak OLUŞMAMAKTADIR. Bu yüzden kullanıcı GPU bellek limitini aşan verilen verifikasyonundan kendisi sorumludur.

Örneğin 10000×10000’lik double tipinde rastgele sayıları bellekte oluşturulalım ve GPU’ya aktaralım.
A = rand(10000);
Agpu = gpuArray(A);

Bu işlemden önce ekran kartımıza baktığımızda:
bos-bellek-1
İşlemin sonunda baktığımızda:
bos-bellek-2

Ekran kartı belleğimizde boş yer olduğu görülmektedir. Aynı şekilde yeniden bir rastgele sayı matrisi oluşturduğumuzda hata vermektedir çünkü bu yeni oluşturacağımız kısmı yerleştirecek alan bulunmamaktadır.

İlk başta boş alan: 973,668,352 byte’dır.
Rastgele 100 milyon sayı doldurulunca 173,604,864 byte alan kalmıştır.
1 double 8 byte olduğundan 800,000,000 byte alan dolmuştur.

Bellekte yeterli alan açmak için;
clear komutuyla GPU belleğindeki veriler silinebilir
veya
gpu = gpuDevice(1);
reset(gpu);

komutlarıyla ekran kartı resetlenebilir.


GPU hesaplama her zaman neden hızlı değildir?

GPU hesaplama her zaman neden hızlı değildir?

A = 1:0.01:50000;
Agpu = gpuArray(A);
tic;
B = fft(A);
toc
tic;
Bgpu = fft(Agpu);
toc
B_from_gpu = gather(Bgpu);

Yukarıdaki kodu incelediğimizde 1’en başlayaran 0.01’er artarak 50000’e kadar giden bir dizi oluşturulmaktadır.

fft işlemi hem CPU’da hem de CPU’dan GPU’ya gönderilen Agpu verisiyle GPU’da yaptırılmakta, sonuçlarda B_from_gpu değişkenine gather komutu ile geri taşınmaktadır.

CPU’daki 1.725417 saniye sürerken, GPU’daki 0.644574 saniye sürmüştür. Burada 5 milyon elemanlı bir dizi olduğundan hızlanma söz konusudur, bunu çok düşürdüğümüz zaman(örneğin 500-1000 gibi) GPU, CPU’nun arkasında kalmaktadır. Bunun sebebi verinin taşınmasından kaynaklı gecikmedir.



MATLAB ve C/C++ kullanırken verilerin bellekte sıralanması

MATLAB ve C/C++ kullanırken verilerin bellekte sıralanması birbirinden farklı olarak gerçekleşmektedir. MATLAB’da sütun bazlı bir sıralama var iken, C/C++’da ise satır bazlı sıralama kullanılmaktadır. Aynı veriyi ikisinde de kullanacaksak verilerin indekslerini iyi tutmamız gerekmektedir.

İkinci bir sıkıntı da C/C++’da indeksleme 0’dan başlarken, MATLAB’da 1’den başlamaktadır. Bu da aynı verilere aynı indeks formülizasyonu ile ulaşılmasına izin vermeyen başka bir sıkıntıdır.

Aşağıda örnek bir matris ve bellekte yerleşimi gösterilmiştir.

a-matrisi

memory-offset-data


Sayfalar:123456789