Multi Core Programlama

Merhaba Arkadaşlar,

Sürekli gelişen teknoloji sayesinde artık çoğumuzun evindeki ya  da iş yerindeki bilgisayarlar birden çok işlemciyi içinde barındırıyor. Pek çok yazılım şirketi de yeni yazılımlarını bilgisayardaki tüm işlemcileri kullanır şekilde değiştirmeye başladılar. Ben de bu yazıda birden çok işlemciyi ya da çekirdeği kullanabilmek için nasıl program yazmamız gerektiğinden bahsedeceğim.

Öncelikle neden birden çok işlemciye ihtiyaç duyabileceğimizi düşünelim. Eğer işlemcilere çok fazla güç bindirebilecek veya kısa sürede hesaplamamız gereken işlerimiz var ise var olan tüm çekirdekleri kullanmak bize ciddi bir zaman kazanımı olarak geri dönecektir.

Bu işi C# da yapabilmemizin birden fazla yolu var. Hepsini birer örnekle açıklayarak anlatacağım. Her yol için aynı örneği kullanarak size yazım olarak hem de performans olarak karşılaştırma imkanı sunacağım. Problememiz 24 tane picturebox a 200×200 pikselleri bir butona bastığımız anda yüklemek olsun. Bu kodu üç ayrı şekilde yazarak ; yazım kolaylıklarını ve çalışma zamanı performanslarını inceleyeceğiz.

1. Seri Program (Tek işlemci) Kullanmak

Bu kod bloğunda 24 adet picturebox a 3 ayrı resmimizi sıra ile sürekli olarak tek for döngüsü ile atıyoruz. Benim bilgisayarımda aldığım ortalama çalışma zamanı süresi : 0,050 saniye civarı bu sizin işlemcinizin gücüne göre farklılık gösterecektir. Kodumuz oldukça kısa ve anlaşılır durumdadır.

2. Parallel For Yapısını Kullanmak (.net framework parallel extension)
Visual Studio 2010 (.net framework 4.0 ) ile gelecek olan parellel extension paketi bize programlarımızı yazarken birden çok çekirdeği kullanmamız için esnek bir dil yapısı getiriyor. Seri koddan farklı olarak ufak bir syntax değişimi ile kodumuzun parallel olarak çalışmasını sağlayabiliyoruz. Bu kodun resimleri yüklerken harcadığı süre ise : 0.029 saniye neredeyse seri koddan 2 kat kadar hızlı. Bu benim bilgisayarımın çift çekirdek olmasından kaynaklanıyor. 4 çekirdekli bilgisayarlarda kodu deneyecek olursak bu sonuçun seri koda göre 4 de 1 e yakın olmasını beklememiz gerekmektedir. Ayrıca ben bu örnekleri VS 2010 da hazırladığım için çalıştırabilmeniz için bilgisayarınızda kurulu olması gerekmektedir.

3.Multi-Thread Yapı Kullanmak
Son olarak da çok daha uzun yazarak ve thread yapılarını kullanarak bu işlemi nasıl gerçekleştireceğimize bir bakalım. Önce 2 çekirdekli bir bilgisayara sahip olduğum için 2 ayrı thread yaratıyorum.

Threadlerden biri ilk 12 resmi diğeri de son 12 resmi yüklemekle ilgilenecek. Burada görevleri eşit olarak paylaştırmak önemlidir, aksi takdirde performansımızı daha çok iş yükü bulunan thread belirleyecek haliyle de sonucumuz beklenenden daha yavaş çıkacaktır.

Threadleri oluşturduktan sonra aşağıdaki kendilerine ait olan fonksiyonları çağırıyoruz. Burada yaptığımız ilk iki örnekte yaptıklarımızı ikiye bölerek ayrı ayrı yazmak, yani bir nevi kod tekrarı yapmak. Bu şekilde işletim sisteminin threadleri ayrı işlemcilere dağıtması için imkan sağlamış olduk. Her iki thread kendine ait işi yapacaklardır. Daha sonra biz işlemin 1 saniyenin altında bittiğini bildiğimizden butona tıkladığımız kodun içinde bu iki threadin harcadıkları zamanları karşılaştırdık. Yavaş olan bizim performansımızı belirleyeceği için sonuç olarak onu ekrana yazdırıyoruz. Bu işlemin harcadığı ortalama süre benim bilgisayarımda : 0,27 saniye çıktı.

Parallel for ile threadler arasında çok az da olsa bir fark görünse de thread yapısının pek çok dezavantajı bulunmaktadır. Örneğin;

  • Daha uzun kod yazmak.
  • Kodları eşit yüklere bölmeye çalışmak.
  • İşlemci sayısına göre kodları düzenlemek (Ben bu örnekte 2 tane thread oluşturdum ama 4 çekirdekli bir pc de kodu çalıştıracak olsak kodumuz yine aynı performası gösterecekti. İyileşmeyi gözlemlemek için en az işlemci sayısı kadar thread yaratmak gerekmektedir.).

Uğur ATMACA

Yazar Hakkında

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

mynet mynet sohbet