Çoklu kullanım

Çoklu kullanım ya da donanımsal çoklu iş parçacığı (hardware multithreading), tek bir işlemci çekirdeğinin birden çok iş parçacığını donanım düzeyinde desteklemesidir. Bir iş parçacığı bellek erişimi ya da uzun gecikmeli başka bir işlem yüzünden beklediğinde çekirdek başka bir iş parçacığına geçer ve boş kalmaz.[1]
Yöntemin amacı tek bir iş parçacığını hızlandırmak değil, birim zamanda tamamlanan toplam işi artırmaktır. Kaynaklar paylaşıldığı için tek bir iş parçacığının süresi azalmayabilir, hatta uzayabilir; buna karşılık çekirdeğin boş geçirdiği çevrim sayısı düşer. Bu nedenle çoklu kullanım, gecikmeye duyarlı işlerden çok işlem hacmine dayalı iş yükleri ve sunucu uygulamaları için uygundur.[1]
Çoklu kullanım, çok çekirdekliliğin yerine geçen bir yöntem değildir. Çok çekirdeklilik çekirdek sayısını artırarak iş parçacığı düzeyindeki koşutluğu sömürür; çoklu kullanım ise var olan çekirdeği daha dolu çalıştırır. Günümüz işlemcilerinin çoğu ikisini birlikte kullanır.[2]
Neden gerekir
[değiştir | kaynağı değiştir]Bir işlemcinin yürütme birimleri her çevrimde dolu tutulamaz. Sırasız yürütüm, dallanma öngörüsü ve derin boru hatları tek bir iş parçacığından çıkarılabilecek koşutluğu artırır, ancak bu koşutluk sınırlıdır: bir buyruk kendinden öncekinin sonucunu bekliyorsa hiçbir düzenek onu erkene alamaz.[1]
Belleğe erişim bu boşluğu büyütür. Ana bellekten bir veri getirmek yüzlerce saat çevrimi sürebilir ve o süre boyunca tek iş parçacıklı bir çekirdekte yapacak iş kalmaz. Bellek duvarı denen bu açık kapandıkça değil büyüdükçe, boş geçen çevrimleri değerlendirmenin değeri de artmıştır.[2]
Çoklu kullanımın çıkış noktası budur. Bir iş parçacığı beklerken başka bir iş parçacığının hazır buyrukları vardır ve bunlar birbirinden bağımsız olduğu için aralarında veri bağımlılığı yoktur. Boş yuvaları başka bir iş parçacığından gelen buyruklarla doldurmak, tek bir iş parçacığından daha fazla koşutluk sıkmaya çalışmaktan ucuzdur.[1]
Donanım maliyeti
[değiştir | kaynağı değiştir]
Bir çekirdeğin birden çok iş parçacığını taşıyabilmesi için her iş parçacığının kendi durumunu ayrı tutması gerekir. Çoğaltılması gerekenler program sayacı, yazmaç öbeği ve durum yazmaçlarıdır; iş parçacığı değiştiğinde bunların yeniden yüklenmesi gerekmez, çünkü her biri zaten yerinde durur.[2]
Geri kalan her şey paylaşılır: boru hattı, yürütme birimleri, önbellekler, adres dönüştürme ön belleği ve dallanma öngörü yapıları. Maliyet bu yüzden çekirdeği ikiye katlamak değil, yalnızca çoğaltılan durum kadardır; eklenen alan tipik olarak çekirdek alanının yüzde beşini geçmez.[1]
Paylaşım aynı zamanda yöntemin sınırıdır. İki iş parçacığı aynı önbelleği kullandığında birbirinin verisini dışarı atabilir, aynı yürütme birimini istediğinde biri beklemek zorunda kalır. Bu nedenle çoklu kullanımdan elde edilen kazanç iş yüküne göre büyük ölçüde değişir ve kimi durumlarda tek iş parçacıklı çalışmanın altına düşebilir.[1]
Türleri
[değiştir | kaynağı değiştir]Donanımsal çoklu kullanımın üç temel türü, iş parçacıkları arasında geçişin ne zaman yapıldığına göre ayrılır.[1]
Sık geçişli çoklu kullanım
[değiştir | kaynağı değiştir]Sık geçişli çoklu kullanımda (fine-grained multithreading, ince taneli) her saat çevriminde başka bir iş parçacığından buyruk yürütülür ve iş parçacıkları arasında dönüşümlü olarak dolaşılır. Bir iş parçacığı beklediğinde sıra ona uğramaz, çevrim boşa gitmez.[1]
Yöntem hem kısa hem uzun gecikmeleri gizler, çünkü art arda gelen çevrimlerde farklı iş parçacıkları çalıştığı için aralarında veri bağımlılığı bulunmaz. Bedeli, tek bir iş parçacığının yavaşlamasıdır: hazır olsa bile sırası gelene kadar bekler. Erken örneklerinden biri, buyrukları on ayrı iş parçacığı arasında dönüşümlü işleyen CDC 6600'ün çevre işlemcileridir; bu düzene o dönemde fıçı işlemci denmiştir.[3]
Yeterince iş parçacığı varsa yöntem donanımı sadeleştirebilir. Art arda gelen çevrimlerde farklı iş parçacıkları çalıştığı için, boru hattı derinliği kadar iş parçacığı bulunduğunda bir buyruğun kendinden az önceki bir buyruğun sonucunu beklemesi olanaksız hâle gelir. Böyle bir tasarımda veri yönlendirmesi devrelerine ve bağımlılık denetimi mantığına gerek kalmaz; boru hattı kilitlemesiz kurulabilir.[1]
Bu sadeleşmenin koşulu, her çevrimde çalışacak hazır iş parçacığının bulunmasıdır. İş parçacığı sayısı boru hattı derinliğinin altına düştüğünde bağımlılıklar geri gelir ve donanımın bunları yeniden ele alması gerekir. Tera MTA gibi uç örnekler bu koşulu tasarımın temeline koymuş, veri önbelleğini tümüyle kaldırıp bellek gecikmesini yalnızca iş parçacığı sayısıyla örtmüştür; buna karşılık az sayıda iş parçacığı taşıyan bir programda başarım hızla düşer.[1]
Seyrek geçişli çoklu kullanım
[değiştir | kaynağı değiştir]Seyrek geçişli çoklu kullanımda (coarse-grained multithreading, kaba taneli) geçiş her çevrimde değil, yalnızca uzun gecikmeli bir olayda yapılır. Bu olay genellikle ikinci düzey önbellekte bulamamadır. Olay gerçekleşene kadar aynı iş parçacığının buyrukları yürütülmeye devam eder.[1]
Bu yaklaşımın üstünlüğü tek iş parçacığının başarımını düşürmemesidir; iş parçacığı beklemediği sürece tam hızda koşar. Buna karşılık geçişin kendisi bedava değildir: boru hattındaki buyrukların boşaltılması gerekir ve bu, geçiş başına birkaç çevrim kaybettirir. Bu yüzden yalnızca kaybı karşılayacak kadar uzun gecikmelerde geçiş yapmak anlamlıdır.[1]
Geçişin bedeli, boru hattının o anda taşıdığı buyruklardan gelir. Yeni iş parçacığına geçilirken eski iş parçacığının boru hattındaki buyrukları ya tamamlanmayı bekler ya da boşaltılır; her iki durumda da birkaç çevrim kaybedilir. Bu yüzden tetikleyici olarak seçilen olayın, kaybedilen çevrimlerden belirgin biçimde uzun sürmesi gerekir. Birinci düzey önbellekte bulamama çoğu tasarımda bu ölçüte uymaz, ikinci düzeyde bulamama uyar.[1]
Yöntem, işletim sistemindeki bağlam değiştirmeye benzetilebilir; ikisi de bir iş beklerken başkasına geçer. Aradaki fark ölçektedir. İşletim sistemi geçişi binlerce çevrim sürer, çünkü yazmaçların belleğe yazılıp geri okunması gerekir; donanım geçişinde her iş parçacığının yazmaçları zaten ayrı durduğundan yazma ve okuma yoktur, geçiş birkaç çevrimde biter.[2]
Eşzamanlı çoklu kullanım
[değiştir | kaynağı değiştir]Eşzamanlı çoklu kullanımda (simultaneous multithreading, SMT) geçiş diye bir şey yoktur; aynı saat çevriminde birden çok iş parçacığından buyruk yürütülür. Yöntem çoklu buyruk başlatımlı işlemcilere uygulanır ve bir çevrimde doldurulamayan yürütme yuvalarını başka iş parçacıklarından gelen buyruklarla kapatır.[4]
Üç tür arasında yuva doldurma açısından en etkilisi budur, çünkü ötekilerde bir çevrimdeki bütün yuvalar tek bir iş parçacığına ayrılmışken burada aynı çevrim birden çok iş parçacığı arasında bölüşülebilir. Karşılığında donanım en karmaşık olanıdır: her buyruğun hangi iş parçacığına ait olduğu boru hattı boyunca izlenmeli, yazmaç yeniden adlandırma ve buyruk çizelgeleme bu bilgiyi taşımalıdır.[4]
Çok çekirdeklilikle karşılaştırması
[değiştir | kaynağı değiştir]
Çoklu kullanım ile çok çekirdeklilik aynı koşutluğu, iş parçacığı düzeyindeki koşutluğu sömürür, ama bunu ayrı yollardan yapar. Çok çekirdeklilikte her iş parçacığının kendi yürütme birimleri ve kendi birinci düzey önbelleği vardır; çoklu kullanımda ise bunlar paylaşılır.[2]
Bunun sonucu şudur: çok çekirdeklilik daha yüksek başarım verir ama alan ve güç açısından pahalıdır, çoklu kullanım ise ucuzdur ama kazancı iş yükünün çekirdeği ne kadar boş bıraktığına bağlıdır. Bütün yuvaları zaten dolduran bir iş yükünde çoklu kullanımdan kazanç beklenmez; belleğe sık giden ve boşluk bırakan iş yüklerinde kazanç belirgindir.[1]
İkisi birbirini dışlamadığı için birlikte kullanılır. Sunucu işlemcilerinde her çekirdeğin iki ya da daha çok iş parçacığı taşıması olağandır; bu durumda işletim sistemi çekirdek sayısının katı kadar mantıksal işlemci görür.[2]
Yazılımdan görünüşü
[değiştir | kaynağı değiştir]Donanımsal çoklu kullanım, işletim sistemine her iş parçacığını ayrı bir mantıksal işlemci olarak gösterir. İşletim sistemi bu birimlere iş dağıtırken bunların gerçek çekirdekler mi yoksa aynı çekirdeği paylaşan iş parçacıkları mı olduğunu bilmezse verimsiz kararlar verebilir; iki iş parçacığını boş bir çekirdek dururken aynı çekirdeğe yerleştirmek buna örnektir. Bu yüzden zamanlayıcılar mantıksal işlemcilerin hangi çekirdeğe ait olduğunu dikkate alır.[2]
Uygulama programları açısından ise çoklu kullanım saydamdır. Program, iş parçacıklarını çoklu görev için zaten oluşturmuş olur; donanımın bunları aynı çekirdekte mi ayrı çekirdeklerde mi yürüttüğü programın doğruluğunu etkilemez, yalnızca hızını etkiler.[2]
İş parçacığı seçimi
[değiştir | kaynağı değiştir]Birden çok iş parçacığı hazır olduğunda hangisinden buyruk alınacağına donanım karar verir. Bu karar her çevrimde yeniden verildiği için çizelgeleme mantığının hem basit hem hızlı olması gerekir.[1]
En yalın kural sırayla dolaşmaktır: iş parçacıklarına dönüşümlü olarak sıra verilir, hazır olmayanlar atlanır. Kural donanımda birkaç kapıya sığar ve iş parçacıkları arasında adaleti kendiliğinden sağlar. Buna karşılık iş parçacıklarının o anki durumunu hesaba katmaz; boru hattını tıkamak üzere olan bir iş parçacığı da sırası geldiğinde buyruk gönderir.[4]
Eşzamanlı çoklu kullanımda daha seçici kurallar kullanılır. Yaygın olanlardan biri, boru hattında en az buyruğu bulunan iş parçacığını öne almaktır; böylece ilerlemeyen bir iş parçacığının boru hattını doldurup ötekileri engellemesi önlenir. Ölçülen kazancın bir bölümü doğrudan bu seçim kuralından gelir; kötü bir kural, çoklu kullanımın kazancını büyük ölçüde harcayabilir.[4]
Seçimin bir de öncelik yanı vardır. İki iş parçacığından biri gecikmeye duyarlı, öteki arka plan işi ise, donanımın ikisine eşit davranması istenmeyebilir. Kimi işlemciler yazılımın iş parçacığı başına öncelik bildirmesine izin verir ve çizelgeleme bu önceliği gözetir.[2]
Başarım
[değiştir | kaynağı değiştir]Çoklu kullanımdan elde edilen kazanç iş yüküne göre geniş bir aralıkta değişir ve tek bir sayıyla verilemez. Kazancın kaynağı, tek iş parçacıklı çalışmada boş geçen yuvalardır; boşluk ne kadar çoksa doldurulacak yer de o kadar çoktur.[1]
Belleğe sık giden, önbellekte sık bulamayan iş yüklerinde kazanç yüksektir, çünkü tek iş parçacıklı çalışmada çekirdek uzun süre bekler. Buna karşılık yürütme birimlerini zaten dolduran, verisini önceden getiren ve önbelleğe sığan programlarda doldurulacak boşluk kalmaz; bu durumda çoklu kullanım kazanç getirmediği gibi, paylaşılan önbellek yüzünden kayba da yol açabilir.[1]
Ölçülen değerler bu nedenle birbirinden uzaktır. İki iş parçacıklı eşzamanlı çoklu kullanımda tipik kazançlar yüzde on ile otuz arasında bildirilmiştir; kimi sunucu iş yüklerinde bu oran daha yüksektir, kimi hesap yoğun programlarda ise negatiftir. İş parçacığı sayısını artırmak da doğrusal bir kazanç vermez, çünkü paylaşılan kaynaklar üzerindeki baskı iş parçacığı sayısıyla birlikte büyür.[1][4]
Ölçüm yapılırken bakılan büyüklüğün hangisi olduğu önemlidir. Çoklu kullanım işlem hacmini artırırken tek bir iş parçacığının süresini uzatabilir; toplam iş miktarına bakan bir ölçüm kazanç gösterirken, tek bir işin bitiş süresine bakan bir ölçüm kayıp gösterebilir. İkisi çelişmez, farklı şeyleri ölçer.[1]
Güç ve ısı
[değiştir | kaynağı değiştir]
Çoklu kullanım bir güç tasarrufu yöntemi değildir; tersine, çekirdeğin boş geçirdiği çevrimleri doldurduğu için güç tüketimini artırır. Boşta bekleyen bir yürütme birimi az akım çeker, çalışan bir birim çok; yuvalar dolduğunda çekilen anlık güç de yükselir.[1]
Artan şey yalnızca güç değil, aynı güçle yapılan iştir. Çoklu kullanımın eklediği donanım çekirdek alanının küçük bir bölümü olduğundan sızıntı akımını kayda değer biçimde büyütmez; artan güç büyük ölçüde gerçekten iş yapmaktan gelir. Bu nedenle uygun iş yüklerinde birim güce düşen işlem hacmi yükselir ve çoklu kullanım, işlem hacmini artırmanın ucuz yollarından biri sayılır. Aynı artışı yeni bir çekirdek ekleyerek elde etmek hem daha çok alan hem daha çok güç ister.[1][2]
Isı açısından tablo biraz farklıdır. Bir yongada soğutma çözümü ve güç bütçesi en kötü duruma göre tasarlanır; tek iş parçacıklı çalışmada bu bütçenin bir bölümü kullanılmadan kalır ve çoklu kullanım aynı bütçeden daha çok iş çıkarır. Ayrıca iş, çekirdek içindeki daha çok birime yayıldığı için ısı tek bir noktada toplanmak yerine dağılır; sıcak noktalar hem güvenilirlik hem de saat sıklığının düşürülmesi açısından belirleyici olduğundan bu dağılım işe yarar.[2]
Yöntemin sınırı da buradadır. Güç ve ısı bütçesi dolduğunda çoklu kullanımın getirdiği ek iş, saat sıklığının düşürülmesiyle geri alınabilir; böyle bir durumda ölçülen kazanç beklenenden küçük çıkar.[1]
Tarihçe
[değiştir | kaynağı değiştir]Çoklu kullanımın kökeni, buyruk düzeyinde koşutluk çalışmalarından öncesine gider. 1964'te tanıtılan CDC 6600'ün çevre işlemcileri, on ayrı iş parçacığını her çevrimde dönüşümlü olarak işleyen bir düzen kullanıyordu; tek bir donanım kümesi on mantıksal işlemci gibi davranıyordu. Dönemin adlandırmasıyla bu düzene fıçı işlemci denmiştir.[3]
1982'de tanıtılan Denelcor HEP, çoklu kullanımı bir yan özellik olarak değil tasarımın merkezine koyan ilk sistemlerdendir. Bellek gecikmesini önbellekle azaltmak yerine, yeterince çok iş parçacığı çalıştırarak gizlemeyi amaçlıyordu. Aynı yaklaşım 1990'larda Tera MTA ile sürdürüldü; bu makinelerde veri önbelleği bulunmuyor, gecikme yalnızca iş parçacığı sayısıyla örtülüyordu.[1]
Eşzamanlı çoklu kullanım kavramı 1995'te Tullsen, Eggers ve Levy'nin çalışmasıyla ortaya kondu ve çoklu buyruk başlatımlı işlemcilerde boş kalan yuvaların başka iş parçacıklarıyla doldurulabileceğini gösterdi.[4] Yöntemi ilk gerçekleyecek ticari tasarım olan Alpha 21464, 2001'de Alpha mimarisinin geliştirilmesine son verilmesiyle birlikte tamamlanmadan iptal edildi.[1]
Yöntem yaygın kullanıma 2002'de Intel'in Hyper-Threading adıyla sunduğu iki iş parçacıklı eşzamanlı çoklu kullanımla girdi. Ardından IBM POWER5 ve Sun'ın çekirdek başına dört, sonra sekiz iş parçacığı taşıyan UltraSPARC işlemcileri geldi. Günümüzde sunucu ve masaüstü işlemcilerinin çoğu çekirdek başına iki ya da daha çok iş parçacığı taşır.[2]
Güvenlik
[değiştir | kaynağı değiştir]Kaynak paylaşımı, çoklu kullanımın başarım kazancının kaynağı olduğu kadar bir güvenlik açığının da kaynağıdır. Aynı çekirdeği paylaşan iki iş parçacığı önbellekleri, yürütme birimlerini ve dallanma öngörü yapılarını ortak kullandığından, birinin davranışı ötekinin çalışma süresini ölçülebilir biçimde değiştirir. Bu, bir iş parçacığının ötekinin işlediği veri hakkında bilgi sızdırmasına yol açabilir.[5]
Bu tür yan kanal saldırıları nedeniyle kimi işletim sistemleri ve bulut sağlayıcıları, güvenlik sınırının iki yanındaki işleri aynı çekirdeğe yerleştirmemeyi tercih eder; kimi durumlarda eşzamanlı çoklu kullanımın tümüyle kapatılması önerilmiştir. Kapatmanın bedeli, iş yüküne göre belirgin bir başarım kaybıdır.[5]
Örnekler
[değiştir | kaynağı değiştir]- CDC 6600 çevre işlemcileri (1964), sık geçişli çoklu kullanımın erken örneği
- Denelcor HEP (1982) ve Tera MTA (1990'lar), bellek gecikmesini çoklu kullanımla gizlemek üzere tasarlanmış sistemler
- Intel Hyper-Threading, eşzamanlı çoklu kullanımın ilk yaygın ticari uygulaması
- IBM POWER5 ve sonrası
- Sun UltraSPARC T1 (2005), çekirdek başına dört iş parçacığıyla sık geçişli çoklu kullanım
- Sun UltraSPARC T2, çekirdek başına sekiz iş parçacığı
Kaynakça
[değiştir | kaynağı değiştir]- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Hennessy, John L.; Patterson, David A. (2017). Computer Architecture: A Quantitative Approach (6 bas.). Morgan Kaufmann. ISBN 978-0-12-811905-1.
- 1 2 3 4 5 6 7 8 9 10 11 12 Patterson, David A.; Hennessy, John L. (2017). Computer Organization and Design: The Hardware/Software Interface (5 bas.). Morgan Kaufmann. ISBN 978-0-12-407726-3.
- 1 2 Thornton, James E. (1970). Design of a Computer: The Control Data 6600. Scott, Foresman and Company.
- 1 2 3 4 5 6 Tullsen, Dean M.; Eggers, Susan J.; Levy, Henry M. (1995). "Simultaneous Multithreading: Maximizing On-Chip Parallelism". Proceedings of the 22nd Annual International Symposium on Computer Architecture. ss. 392-403. doi:10.1145/223982.224449.
- 1 2 Percival, Colin (2005). "Cache Missing for Fun and Profit". 5 Eylül 2026 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Eylül 2026.