Salı, Eylül 09, 2008

OpenMP ve OpenCv ile Kenar Bulma

Öncelikle uygulamamızdan bahsetmek istiyorum. Basit bir kenar bulma işlemi yapacağız. Hem OpenMP'li Hemde normal yapacağız ki performans farkını görelim
  • İlk etapta resmi siyah beyaza çeviriyoruz. Bu işlemi programda görüntüyü yüklerken "CV_LOAD_IMAGE_GRAYSCALE" diyerek hallediyoruz. (bakınız işin kolayına kaçma metodları s-??? )
  • Kenar bulma için kullanacağımız metod ise gayet basit. Bir pikselin solundaki veya üstündeki piksel ile olan renk farkı belli bir eşik değerini aşıyorsa kenardır, beyaz (255) olarak işaretlenir. Aşmıyorsa kenar değildir, Siyah (0 ) değeri atanır.yani
X kenarı bulunacak görüntü dosyası olsun K ise Kenarları gösterdiğimiz görüntü dosyası olsun

Eğer |X(i,j)-X(i-1,j)| > eşik veya |X(i,j)-X(i,j-1)| > eşik
ise K(i,j)=255;
değil ise K(i,j)=0;
  • işlemin mantığından da anlayabileceğiniz gibi her piksel için yapılacak işlem bağımsız. ve paralel olarak çalıştırmak için gayet uygun bir metod.
  • Kenar bulma fonksiyonumuzda bir döngü ( for ) içinde pikselin kenar olup olmadığını bulan kodu yazıyoruz.
  • Şimdi geldik işin en zor kısmı olan paralel versiyonunu yazmaya. Kenar bulma fonksiyonumuzu kopyele yapıştır deyip 2. bir nüshasını alıyoruz ! Adını OpenMP li olarak değiştiriyoruz. for döngümüzden önceki satıra şu çoook zor satırı yazıyoruz.
#pragma omp parallel for
yani diyoruz ki bundan sonraki for döngüsünü paralel çalıştırılsın.
Sonarasında çalıştırıp sonuçları gözlüyoruz.


Benim evdeki AMD64 çift çekirdekli işlemcideki performansı Resimde de görebilirsiniz. % 44 lük bir hızlanma hem de tek satırlık eklemeyle hiç fena değil öyle değilmi ? Farkın nereden geldiğini CPU Usage grafiğinde rahatlıkla görebilirsiniz. OpenMP siz kenar bulma fonksiyonu çalışırken işlemcinin sadece biri çalışıyor. OpenMP li versiyonunda işlemci kullanımı % 100 lere ulaşıyor.

Sonuç : OpenMP ile işlemcinizin atıl duran çekirdeklerinide çalıştırıp programlarınızı hızlandırabilirsiniz. Hatta hiç başka bir detay öğrenmeseniz bile bizim burada bahsettiğimiz paralel çalıştırılabilecek döngüler çok işinize yarıyacaktır eminim. Helede İşlemcilerin çekirdek sayılarının arttığını düşürsek - 4 çekirdekli çıktı bile-

Örneği İndirmek için : OpenCV & OpenMP

4 çekirdekli işlemcisi olup da deneyen olursa performans artışını bize bildirsin. seviniriz.

8 yorum:

deneme dedi ki...

Evet, gerçekten çok kolay.

Ancak atladığımız küçük bir nokta mevcut.

Şu an dünyada herşeyin bir çalışma mekanizması mevcut. Eğer bu mekanizmayı gerçekten tasarlayan biz olsaydık bunların göründüğü kadar kolay olmadığını anlayabilirdik.

En basit bir örnekten biraz daha zor örneklere gidebilirsek.

Suyun, hangi atomlardan meydana geldiğini biliyoruz. 2 Hidrojen bir Oksijen atomundan. Ancak suyun möleküllerin çekim gücünün nasıl ve kimin tarafından meydana geldiğini araştırmayız.

Televizyon seyretmek için televizyonun düğmesine basmamız yeterlidir. Kumanda ile televizyonu kontrol ederiz. Ancak televizyonu meydana getiren transistörlerin,kondansatörlerin dirençlerin,diyotların vb nasıl bir etkileşim içine girip de bize görüntüyü ve sesi, incecik bir anten kablosu üzerinden getirdiğini
hesaba katmayız.

Programlama dillerinde küçücük bir printf("%s","Merhaba Dünya\n");
fonksiyonun, işlevinin işletim sisteminde nasıl bir hareketlenme yaptığını derinliklerine inerek düşünmeyiz. Ancak printf() fonsiyonunun en kolay fonksiyon olduğunu düşünürüz.

Örnekler çoğaltılabilir.

Kısaca, herşey göründüğü kadar basit değildir. Şu zamanki maddi dünyada -- ki maddi dünya olduğu da tartışılır çünkü maddenin ne olduğu bu zamana kadar her zaman tartışılmıştır -- bilebildiğimiz kadar bilginin özüne inip paha biçilmez emeği göz ardı etmemektir.

bluekid dedi ki...

üşenmeden yazmış olduğunuz uzun yorum için teşekkürler
yazıda kimsenin emeğini küçümsemiyorum. Eğer o şekilde anlaşıyorsa anlatmayı beceremediğimdendir.
Ben programcıların OpenMP kullanarak CPU atıl kapasitelerini değerlendirmeleri için teşvik etmeye çalışıyorum.
Arka planda çok kompleks ve karmaşık şeylerin çalışıyor olması kullanımının zor olmasını gerektirmez. Bu sade ve taşınabilir yapıyı çok kolay kullanabilirsiniz, çekinmeyin kurcalayın diyorum.
Derinine hiç inmesenizde anlattığım kadarıyla kullansanız bile %40 bir performans artışı var diyorum. ilgisizlerin bile igisini çekemeye çalışıyorum

yagi dedi ki...

Naçizane tespitim, herhangi bir konuya teşvik edici ve çalışan bir örnekle başlamak pedagojik açıdan daha faydalı.

Zaten konunun biraz daha derinlerine inmeden, kodun her yerine pragma direktifini döşeniz ne olacak ki. Programınız çalışmayacak muhtemelen.

Bu sebeple paralel programlamaya bu süper hızlı giriş özendirici bence.

İnternette bulunan (!) konuyla ilgili kaynaklar ise gani. Mesela "Using OpenMP
Portable Shared Memory Parallel Programming" kitabı benim ilgimi çekti hemen.

Adsız dedi ki...

Resmin adi :
kedi.jpg
Kenar Bulma icin Harcanan sure = 368.626 ms
OpenMP kullanarak Kenar Bulma icin Harcanan sure = 352.103 ms
Performans Orani (%) = % 104.7


neredeyse hic farketmiyor bende (linux kullaniyorum)

bluekid dedi ki...

bu kadar bilgiyle ne söylenebilir bilemiyorum

İşlemciniz çift çekirdeklimi ?
Derlemenin OpenMP'li olduğuna eminmisiniz ?

lostname dedi ki...

emeğiniz için çok teşekkürler,çok güzel bir paylaşım olmuş, takipteyim..

nuhazginoglu.com

Adsız dedi ki...

Hocam çok teşekkürler size ben şuan bu konu üzerinde çalışıyorum ve bir örnek ile görmek istiyorum performansı ama örneğinizi çalıştırdığımda cxcore100.dll eksik hatası veriyor... iki bilgisyarda da denedim çift çekirdekli ve tk çekirdekli bilgisayarlarda gene bu hatayı veriyor bunun sebebi nedir sizce ?

bluekid dedi ki...

OpenCv 1.0 'ı kurun diyor :)