:::: MENU ::::

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


Matlab ile performans artırmak için bazı öneriler…

Paralel programlama ile hızlanmayı hedef alan çalışmalar yapan ve yapmaya devam edecek olan bir karakter olarak Matlab’da uygulanması gereken bazı önerilere yer vereceğim.

1-Döngü içerisinde dosyaya yazma ve dosyadan okuma komutları kullanılmamalıdır. Çünkü dosyaya yazma ve okuma sırasında çağrılan komutlar zaman kaybına neden olmaktadır. Döngü içerisinde illa kullanmamız gerekirse bunları minimuma indirmemiz gerekmektedir. En sağlıklı yöntem döngüye girmeden dosyayı açmak, döngü çıkışında da var olan değişimleri yazdırmaktır.

2-Dinamik olarak değişen değişken boyutları ve yolları kullanmamalıyız. Bir dosya yolu sürekli değişir halde olursa kodun yavaş çalışmasına sebep olmaktadır. Yine boyutu belli olmayan değişken, vektör ve matrisler ciddi manada performans kaybına sebep olmaktadır. O yüzden ilk başta bunların çerçevesini çizmemiz gerekmektedir.

3-Kod okunulabilirliği ve optimizasyonuna önem verilmelidir. Rahat okunan, çabuk derlenen kodlar her zaman daha fazla tercih edilir.


Matlab’ta veriler sütun bazlı şekilde sıralanmaktadır

Matlab’ta veriler sütun bazlı şekilde sıralanmaktadır. Bellekteki verilerin satır bazlı sıralandığına yeni yeni alışırken, Matlab’ta verilerin sütun bazlı şekilde sıralandığını öğrenmenin şokunu yaşamaktayım. Satır bazlıya göre verilerimizi ayarlayıp, ona uygun bir indeks yapısı kurmuştuk, şimdi de sütun bazlı sıralamaya göre bir yapı kurmamız gerekli.

Aynı işlemin satır ve sütun bazlı yapıldığı vakit sütun bazlının daha hızlı olduğunu aşağıdaki örneklerden görebiliriz.


clear all;
A=rand(300,300,40,40);
B=zeros(300,300,40,40);
tic
for i=1:300
for j=1:300
B(i,j,:,:)=2.5 * A(i,j,:,:);
end
end
toc

Yukarıdaki kod 9.972601 saniyede çalışmıştır.

clear all;
A=rand(300,300,40,40);
B=zeros(300,300,40,40);
tic
for j=1:300
for i=1:300
B(i,j,:,:)=2.5 * A(i,j,:,:);
end
end
toc

Yukarıdaki kod 7.140390 saniyede çalışmıştır.

Kodlar incelendiğinde satırların önce okunmasıyla yapılan işlemin daha yavaş olduğu görülmektedir.


Sayfalar:1...6061626364656667