Thread overview
Bir std.parallelism.parallel denemesi
Jun 02, 2011
erdem
Jun 03, 2011
mert
Jun 03, 2011
erdem
Jun 06, 2011
Ronin
June 02, 2011

Bende 2 tane gösteriyor.

Süper! Harika :-D

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 02, 2011

Şu program sizde kaç mikro işlemci çekirdeği gösteriyor?

import std.stdio;
import std.parallelism;

void main()
{
   writefln("Bu ortamda toplam %s çekirdek var.", totalCPUs);
}

Eğer birden fazlaysa, şöyle mutlu bir deney yapalım: Aşağıda her öğrencinin işlemi 1 saniye sürdüğü için foreach döngüsünün 4 öğrenci için 4 saniye tutması normaldir:

import std.stdio;
import core.thread;

class Öğrenci
{
   int numara;

   this(int numara)
   {
       this.numara = numara;
   }

   void uzunBirİşlem()
   {
       writeln(numara, " numaralı öğrencinin işlemi başladı");

       /* Gerçekte yavaş olduklarını varsaydığımız işlemlerin
        * yavaşlıklarına benzesin diye 1 saniye bekliyoruz */
       Thread.sleep(dur!"seconds"(1));

       writeln(numara, " numaralı öğrencinin işlemi bitti");
   }
}

void main()
{
   auto öğrenciler = [ new Öğrenci(1), new Öğrenci(2), new Öğrenci(3), new Öğrenci(4) ];

   foreach (öğrenci; öğrenciler) {
       öğrenci.uzunBirİşlem();
   }
}

Ben bir Linux ortamında time ile başlatınca şunu görüyorum:

'$ time ./deneme
1 numaralı öğrencinin işlemi başladı
1 numaralı öğrencinin işlemi bitti
2 numaralı öğrencinin işlemi başladı
2 numaralı öğrencinin işlemi bitti
3 numaralı öğrencinin işlemi başladı
3 numaralı öğrencinin işlemi bitti
4 numaralı öğrencinin işlemi başladı
4 numaralı öğrencinin işlemi bitti

real 0m4.003s <-- 4 saniye
user 0m0.000s
sys 0m0.000s
'

Öğrenci işlemlerini bütün çekirdeklere görevler (task) halinde paylaştırmak çok kolay. Programda yalnızca iki değişiklik yapın:

import std.parallelism;

// ...

   foreach (öğrenci; parallel(öğrenciler)) {

Yani 'öğrenciler' aralığı yerine 'parallel(öğrenciler)' aralığını kullanın.

Şimdi 4 saniye bölü çekirdek sayısı kadar sürecektir. Bendeki işlemcinin 4 çekirdeği olduğu için 1 saniyeye iniyor:

'$ time ./deneme
2 numaralı öğrencinin işlemi başladı
3 numaralı öğrencinin işlemi başladı
4 numaralı öğrencinin işlemi başladı
1 numaralı öğrencinin işlemi başladı
2 numaralı öğrencinin işlemi bitti
3 numaralı öğrencinin işlemi bitti
1 numaralı öğrencinin işlemi bitti
4 numaralı öğrencinin işlemi bitti

real 0m1.004s <-- 1 saniye
user 0m0.000s
sys 0m0.000s
'

Güzel, değil mi? :D

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 03, 2011

Gayet hoş bir olanak.
Harcanan zamana bakıldığında yükün geometrik olarak dağıtıldığını söylemek yanlış mı olur acaba ne dersiniz?
Belki gerekebilir diye not: (Ali hocam Bu çalışmanın dmd 2.053 derleyici ile yapılabileceğini hatırlatmak yerinde olur sanıyorum.)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 03, 2011

Söz işlemcilerden açılmışken ben de ufak bir örnek ekleyeyim. Bu program işlemci bilgisini gösteriyor. Şimdilik sadece X86 işlemcilerle çalışıyor.

import std.cpuid;
import std.stdio;

void main()
{
   writefln(std.cpuid.toString());
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 03, 2011

Evet, 2.053'te eklenen bir modülün marifeti. Güzel olan, bütün bu iş bir modül ile ve bu kadar kısa bir yazımla gerçekleştirilebiliyor. İfade gücü yüksek: parallel() yazmak, foreach bloğundaki kodların aynı anda birden fazla Öğrenci için birden fazla çekirdek üzerinde işletilebileceğini belirtmeye yetiyor.

Hiç nesne kurmak gibi hazırlıklar yapmaya gerek yok.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 06, 2011

Uh! Thread bazlı sınıftan kalıtım almadan da oluyormuş demek ki bu iş. Eyvah eyvah... "D" sektörel olarak bir an önce kullanıma hazır olsa iyi olacak. Dersleri okudukça C e C++ da yaptığım çoğu işi hamallık ve zaman kaybı olarak görmeye başladım.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 06, 2011

Alıntı (Ronin):

>

Uh! Thread bazlı sınıftan kalıtım almadan da oluyormuş demek ki bu iş.

Galiba koşut işlemlerde (parallelism) iş parçacıklarının (thread) varlığı hissedilmiyor. (Başka dillerde de öyle.) İş parçacıkları ile açıkça ilgileneceksek std.concurrency var.

Şimdi "Eş Zamanlı Programlama" (concurrency) konusunu yazmaya başladım. Doğrusu kendim de yeni öğreniyorum ama aralarında şimdilik görebildiğim farklar şunlar:

Alıntı (Ali'nin notları):

>

Eş zamanlı programlama, bir önceki derste gördüğümüz koşut işlemlere çok benzer. Aslında koşut işlemler de perde arkasında eş zamanlı programlama ile gerçekleşirler. İkisi de işlemlerin farklı iş parçacıkları üzerinde aynı anda işletilmeleri ile ilgilidirler ve bu yüzden birbirleriyle çok karıştırılırlar.

Koşut işlemlerle eş zamanlı programlama arasındaki farklar şunlardır:

* Koşut işlemlerin temel amacı mikro işlemci çekirdeklerinden yararlanarak programın hızını arttırmaktır. Eş zamanlı programla ise yalnızca tek çekirdeği bulunan ortamlarda bile gerekebilir ve programın aynı anda birden fazla iş yürütmesini sağlar. Örneğin bir sunucu program her istemcinin işini farklı bir iş parçacığında yürütebilir.
* Koşut işlemler birbirlerinden bağımsızdırlar; birbirlerine bağlı olan işlemlerin koşut olarak işletilmeleri hata olarak kabul edilir. Eş zamanlı programlamada ise çoğu zaman iş parçacıkları birbirlerine bağlıdırlar; örneğin devam edebilmek için başka iş parçacıklarının ürettikleri verilere gerek duyabilirler.
* Her iki yöntem de işletim sisteminin iş parçacıklarını kullanırlar. Koşut işlemler iş parçacıklarını görev kavramının arkasına gizlerler; eş zamanlı programlama ise açıkça iş parçacıkları ile ilgilidir.
* Koşut işlemler çok kolay kullanılırlar ve görevler bağımsız oldukları sürece program doğruluğu açısından güvenlidirler. Eş zamanlı programlama ise ancak mesajlaşma yöntemi kullanıldığında güvenlidir; veri paylaşımına dayanan geleneksel eş zamanlı programlamada programın doğruluğu kanıtlanamayabilir.

D hem veri paylaşımına dayanan eş zamanlı programlamayı hem de mesajlaşmaya dayanan eş zamanlı programlamayı destekler. Veri paylaşımına dayanan eş zamanlı programlama ile doğru program üretmek çok zor olduğu için modern programcılık mesajlaşma yöntemi benimsemiştir. Ben de bu derste std.concurrency modülünün sağladığı mesajlaşma olanaklarını anlatacağım. D'nin veri paylaşımına dayanan eş zamanlı programlama olanaklarını ise en sonda çok kısaca değineceğim.

Alıntı:

>

Dersleri okudukça C e C++ da yaptığım çoğu işi hamallık ve zaman kaybı olarak görmeye başladım.

Aynı hisleri paylaşıyorum! :) Ben günlük olarak daha çok C++, biraz da C kullanıyorum.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]