Şimdi Ara

Multithreading Hakkında Donanım Seviyesinde Bir Soru

Bu Konudaki Kullanıcılar:
2 Misafir - 2 Masaüstü
5 sn
11
Cevap
0
Favori
754
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhaba,
    Unity ile oyun geliştirmekteyim ve performans için kodlarımı paralel olarak çalışacak şekilde yazıyorum. Bu noktada zaman zaman aklıma kurcalayan bir konu var;

    İşlemci çekirdeklerindeki frekans limitinden dolayı çözümü çekirdek sayısını artırmakta bulduk. Fakat bu çekirdekler neden eş zamanlı çalışmak zorunda?

    Mesela 1GHz hızında iki çekirdeğe sahip bir işlemcimiz olsun. Eğer elimizdeki hesaplama paralel olarak yapılamıyorsa çekirdeklerden sadece birini kullanmak zorundayız. Peki çekirdeklerden birisinin zamanlamasını 10^9/2 saniye kaydırsak ve bu çekirdekleri besleyen üst sistemin frekansını 2GHz yapsak. Yani çiviye saniyede bir kez vurabilen 2 işçiden, birisinin vurmaya yarım saniye sonra başlaması ve bu sayede saniyedeki vuruş sayısının 2 katına çıkması gibi.

    Vakit ayırıp okuduğunuz için teşekkürler.



  • Ne demek istediğini pek anlayamasam da kurallar belli. 1 thread sadece 1 çekirdeğin kapasitesi kadar kaynak kullanabilir. Problem paralel olarak bölünemiyorsa yapacak bişey yok. Ne yaparsan yap tek çekirdek kullanır. Ha frekansı 2 katına çıkarırsan tabi ki hız artar.
  • "Es zamanli calismak" derken ne kastediyorsun?

    Eger dogru anliyorsam, bir cekirdegin; diger cekirdekten gelecek sonucu beklemesi icin 1 tam cycle gecmesi yerine cok cok kucuk bir sure gecmesini saglayarak "paralelmis" gibi calismalari neden yapilamiyor demek istiyorsun. Bu zaten yapiliyor, o cycle kendi icinde fetch - decode - execute diye ayriliyor ve pipeline hep ayni state te degil. Ayrica zaten frekans tum core'lar icin ayni da degil.

    Zaten branch prediction ile bekleme olmadan fetch - decode - execute islemi de yapilabiliyor.

    Sorun, cozmeye calistigin problemin ozunde multithread'e yatkin olmamasindan kaynaklaniyor. Branch prediction cok hizlandiran bir olgu olsa da, frekans degisikligi ile sadece bir sonraki fetch sekansini cabuklastiracaksin, o da hic bir seyi optimize etmeyecek.



    < Bu mesaj bu kişi tarafından değiştirildi Mephalay -- 18 Ekim 2019; 11:37:12 >
    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Mephalay M kullanıcısına yanıt
    Cevabınız için teşekkürler. fetch-decode-execute cycle benim için iyi bir referans noktası oldu ve daha fazla doküman bulmama yardımcı oldu.
    Superpipelining, Superscalar ve Out-of-order Execution gibi konularda kaynaklar okudum.

    Şu anda mevcut mimariler ile bir işlem için birden fazla clock cycle gerektiğinden yeni bir fikir olarak şöyle bir şey düşündüm.
    4 çekirdekli bir işlemci için her bir çekirdeğin frekansını t süresince 4GHz ve 3t süresince 0Hz olarak ayarlayacağız. Dört çekirdek de sırayla işini yapacak. 4t için her çekirdeğin ortalama hızı 1GHz iken sıralı olarak çalıştıklarından sürekli 4GHz çalışan tek çekirdeğin yaptığı iş ile aynı işi yapacak.

    Şimdi sorum şu; bir işlemci çekirdeğini sadece 4 cycle için 8-16-32GHz gibi frekanslara çıkarsak ve sonra 12 cycle boyunca bekletsek sorun olur mu?


  • Amaç nedir? Yazdığın şeylerin teknik olarak bir karşılığı yok.



    < Bu mesaj bu kişi tarafından değiştirildi EmuDev -- 18 Ekim 2019; 21:17:11 >
    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Ulan Musk kullanıcısına yanıt
    Static core degilse core frekansi 0 olmaz. Bahsettigin frekansi yakalamak icin verecegin voltaja da hic bi chip dayanmaz. Oscillator calisiyorsa cycle da olacaktir, onu da fde cycle ina gore belirler cpu. Fetch edemediyse underclock yapar. Tek bir clock cycle da basaracagin is miktari senin mimarinle alakali, o yuzden kabaca frekanslarla oynayip optimizasyon yapamazsin, modern bir 1.6 GHz chip 4 ghz eski bir chipten daha performansli calisir, tek cycle da daha fazla is yapar. Bazi durumlarda verecegin is yukune gore core park yapman performansi arttirabilir overheadi azaltacagi icin. O yuzden cok cekirdekli islemcilerin chipsetinde bu duzenleme olur. Yani kabaca cekirdekleri durdurarak performans kazanabilirsin.

    Tam olarak ne elde etmeye calisiyorsun?



    < Bu mesaj bu kişi tarafından değiştirildi Mephalay -- 18 Ekim 2019; 23:8:2 >
    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Ulan Musk kullanıcısına yanıt
    "Şimdi sorum şu; bir işlemci çekirdeğini sadece 4 cycle için 8-16-32GHz gibi frekanslara çıkarsak ve sonra 12 cycle boyunca bekletsek sorun olur mu?"

    Hocam efektif olarak önerin su senin: F->frekens, D->duty cycle ( saniyenin % kaçında islemci calisiyor).
    Senin tavsiyen F frekansında D=1 ile calistirmak yerine, islemciyi, 4F frekansında D/4 duty cycle ile calistirmak (ki sonuçta ayni performansı alalım.)

    Burda gozden kacirdigin şey enerji tüketimi. Dijital devrenin enerji tüketimi: 1)Voltajin karesiyle lineer 2) Frekensla lineer artıyor. Yani Guc Tüketimi =-> P = K*F*V*V*D. (K sabit).

    Onerdigin gibi, F->4F, D->D/4 yaptigimizda, ayni isi yapabileceğiz, ama frekansi 4 kat arttırmak icin voltajı arttirmamiz gerekecek. (Transistorlerin kapıları aslinda birer kapasitordur, frekansı. arttırmak icin, o kapasitoru daha hızlı doldurman gerekecek). Arttirdigin voltajın karesiyle orantilii olarak tueketilen güç artacak.

    Ki yukardakiler, islemcinin birim zamanda daha yüksek güç yoğunluğunda calismasninin islemciye herhangibir etkisi olmayacagini varsaydi. Ama islemciyi iyi soğutsan bile, daha yogun güç tüketimi, islemcinin kimyasal hapisini bozuyor.

    Yukardaki analiz dinamik güç tüketimini anlatıyor. Bir de static güç tüketimi (sizinti/leakage) var, o da voltaj arttıkça artıyor.

    Yani F*D sabit kalacaksa (ayni isi yapmak istiyorsak), D yi 1 yapmak en optimumu.


    Diger bir önerin de, iki islemcyi ayni frekansta calistirip, aralarında phase difference oluşturmak. Bunun sana hiçbir faydası yok çünkü zaten islemciler direk birbirleriyle konuşmuyor. Genellikle L2 cache (bazı mimarilerde L3, multi-socket boardlarda olduğu gibi bazılarında da DDR ya da external cache) araciligiyla haberleşiyorlar. Yani 2 islemcinin birbiriyle iletişimi, L2 cache latency si ile limitli. L2 cache erisimi 10 larca cycle alır. Yani senin iki islemcinin frekansları arasında oluşturduğunu phase differencein hiçbir anlamı yok.

    Bu arada, parallelize edilemeyecek gibi görünen cogu algoritma parallellestirilebilir. Ama alacagin performans arttirimi sublinear olabilir, yani 1 yerine 100 islemci kullandiginda, hiz 100 katına degil de, sadece 10 katına cikabilir.
    Performansi arttırmak icin illa parallelize etmene de gerek yok. Is yüküne gore:
    - Islemcilerin SIMD instructionlari var, onları düzgün kullanirsan yaptigin hesaplamayı hizlandirabilirsin.
    - Cache hierarchy sini düşünerek yazarsan kodunu hizlandirabilirsin. (Prefetch nasıl calisiyor, data setim cache boyutlarından büyük mu, çekirdekler arasında false sharing var mi?)
    - Branch predictor vs gibi seyleri düşünerek de kodunu hizlandirabilirsin. (Mesela benim calistigim bir problemde, bir arrayin sorted olmasi, algoritmayı 4 katin uzerinde hizlandiriyordu, çünkü branch predictorlar her zaman doğru tahmin yapıyor, cache prefercher her zaman bir sonraki adimda kullanılacak datayı cache e yüklüyor vs.)

    Eğer bu konuları öğrenmekte istiyorsan 1) VLSI design, 2) Computer Architecture ve 3) Parallel Programming derslerine bakabilirsin.



    < Bu mesaj bu kişi tarafından değiştirildi mghfreud -- 19 Ekim 2019; 8:50:42 >
  • mghfreud M kullanıcısına yanıt
    Vakit ayırdığınız için teşekkür ederim aradığım cevap buydu. Sorularımı teknik bir dille tanımlayıp aklıma takılan noktaları da tam olarak giderdiniz.
  • EmuDev E kullanıcısına yanıt
    Mephalay M kullanıcısına yanıt
    Hocam amacım bir düşünce deneyi yapmaktı sadece. Yoksa bahsettiğim şeyleri deneyecek bilgi birikimim ve kaynağım yok ve aradığım cevabı buldum vakit ayırdığınız için teşekkürler.
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.