| Flynn sınıflandırması |
|---|
| Tek veri akışı |
| Çoklu veri akışı |
| İlgili kavramlar |
Çoklu buyruk, çoklu veri (İngilizce: multiple instruction, multiple data, kısaca MIMD), Flynn sınıflandırmasındaki dört bilgisayar mimarisi sınıfından biridir. Bu sınıfta birden çok işlem birimi, birbirinden bağımsız buyruk akışlarını birbirinden bağımsız veri akışları üzerinde eşzamanlı olarak yürütür.
Dört sınıfın en genel olanıdır ve günümüzde koşut çalışan sistemlerin neredeyse tamamı bu sınıfa girer. Çok çekirdekli işlemcilerden süper bilgisayar kümelerine ve veri merkezlerine kadar uzanan yapılar MIMD'dir; sınıfın içindeki asıl ayrım, birimlerin belleği nasıl paylaştığıdır.
Michael Flynn'in 1966'da önerip 1972'de ayrıntılandırdığı sınıflandırma, bir makineyi eşzamanlı yürütülen buyruk akışı sayısı ile üzerinde çalışılan veri akışı sayısına göre ayırır. Dört bileşim çıkar: SISD, SIMD, MISD ve MIMD. MIMD, her iki sayının da çok olduğu bileşimdir.
Sınıfın bu kadar geniş olması, ölçütün kabalığından gelir. Dizüstü bilgisayardaki dört çekirdekli bir işlemci ile binlerce düğümlü bir süper bilgisayar aynı kutuya düşer, oysa tasarım açısından birbirlerine hiç benzemezler. Bu nedenle MIMD, kendi içinde bellek düzenine göre yeniden bölünür ve alan yazınında asıl ayrım orada yapılır.

MIMD düzeneğinde her işlem birimi kendi buyruk akışını getirir, çözer ve yürütür. Birimler ne aynı buyruğu aynı anda işlemek ne de aynı hızda ilerlemek zorundadır; biri döngüde dönerken öteki tümüyle başka bir işi bitirebilir. Bu bağımsızlık, sınıfı SIMD'den ayıran özelliktir: SIMD'de tek bir buyruk akışı bütün birimleri aynı anda sürer.
Bağımsızlığın bedeli eşgüdümdür. Birimler ortak bir işin parçalarını yürütüyorsa sonuçlarını bir noktada birleştirmeleri, ortak veriye erişimlerini sıraya koymaları ve birbirlerini beklemeleri gerekir. MIMD tasarımının asıl güçlüğü hesaplamada değil, bu eşgüdümün ucuz tutulmasındadır.

MIMD sistemleri, işlem birimlerinin belleğe nasıl eriştiğine göre iki ana türe ayrılır. Bu ayrım yalnızca donanımı değil, üzerinde yazılacak programın biçimini de belirler.
Bütün birimler tek bir adres uzayına erişir. Bir birimin belleğe yazdığını öteki birim doğrudan okuyabildiğinden haberleşme ayrı bir iş değildir; veri paylaşmak, aynı adrese erişmekten ibarettir. Çok çekirdekli işlemciler bu yapıdadır.
Kolaylığın karşılığı iki sorundur. Birincisi önbellek tutarlılığıdır: her çekirdeğin kendi önbelleği bulunduğundan aynı adresin birden çok kopyası oluşur ve bunların uyumlu tutulması gerekir. İkincisi bellek erişim sıralamasıdır: bir birimin yaptığı yazmaların ötekilere hangi sırayla görüneceği donanımın verdiği güvencelere bağlıdır. Paylaşımlı bellek ayrıca ölçeklenmez; birim sayısı arttıkça ortak belleğe erişim darboğaza döner. Büyük sistemlerde belleğin fiziksel olarak bölündüğü ama tek adres uzayı gibi göründüğü tekdüze olmayan bellek erişimi düzeni kullanılır.
Her birimin kendi belleği vardır ve başka bir birimin belleğine doğrudan erişemez. Veri paylaşmak için birimler ağ üzerinden birbirlerine ileti gönderir. Ortak bir darboğaz bulunmadığından bu yapı çok daha büyük ölçeklere çıkabilir; süper bilgisayar kümeleri, Beowulf kümeleri ve dağıtık hesaplama sistemleri bu sınıftadır.
Buradaki bedel programcıya biner. Veri paylaşımı örtük değildir; hangi verinin ne zaman kime gönderileceği açıkça yazılır. Yanlış bölünmüş bir veri kümesi, hesaplamadan çok haberleşmeye zaman harcayan bir programa yol açar.
Uygulamada iki düzen bir arada bulunur. Bir kümenin her düğümü kendi içinde paylaşımlı bellekli çok çekirdekli bir makinedir, düğümler arasındaysa dağıtık bellek geçerlidir.
MIMD donanımı, birimlerin farklı programlar yürütmesine izin verir; uygulamada ise iki kalıp yerleşmiştir.
Tek program, çoklu veri (SPMD) kalıbında bütün birimlere aynı program yüklenir, ancak her birim kendi kimliğine bakarak verinin farklı bir parçası üzerinde çalışır ve dallanmalarla farklı yollar izler. Donanım MIMD'dir, çünkü birimler bağımsız yürütür ve aynı anda programın farklı yerlerinde olabilirler; tek bir kaynak metnin yazılması ise işi kolaylaştırır. Koşut programların büyük çoğunluğu bu kalıpla yazılır.
Çoklu program, çoklu veri (MPMD) kalıbında birimlere gerçekten farklı programlar verilir. İş akışının parçalarının birbirinden nitelikçe ayrıldığı durumlarda, örneğin bir birimin veri üretip ötekinin işlediği düzenlerde kullanılır.
Araç tarafında bu ayrım bellek düzenini izler: paylaşımlı bellekli makinelerde iş parçacığı temelli arayüzler ve OpenMP gibi derleyici yönergeleri, dağıtık bellekli sistemlerde ise ileti geçişine dayanan kitaplıklar kullanılır.
MIMD sistemlerinde birim eklemek başarımı kendiliğinden artırmaz. Kazanç, işin ne kadarının gerçekten koşut yürütülebildiğine bağlıdır; ardışık kalan bölüm hızlanmaya bir tavan koyar. Bu sınır Amdahl yasası ile ifade edilir ve MIMD tasarımının çıkış noktasıdır.
Ardışık bölümün yanında eşgüdümün kendisi de yük getirir. Kilitler, engeller ve ortak veriye sırayla erişim, birimlerin bir bölümünü beklemede tutar. Paylaşımlı bellekli sistemlerde önbellek satırlarının birimler arasında gidip gelmesi, dağıtık sistemlerde ağ gecikmesi aynı sonucu doğurur: eklenen her birimin katkısı bir öncekinden az olur.
Saat sıklığının artırılamaz hâle geldiği 2000'lerin ortasından sonra başarım artışı birim sayısına kaydı ve MIMD, özel bir mimari sınıfı olmaktan çıkıp olağan tasarım oldu. Cep telefonundaki işlemciden veri merkezindeki sunucuya kadar hemen her makine çok çekirdeklidir.
Sınıflar uygulamada iç içe geçmiştir. Günümüz işlemcileri çekirdek düzeyinde MIMD, çekirdek içinde ise vektör birimleriyle SIMD çalışır; grafik işlem birimleri de çok sayıda SIMD biriminin MIMD gibi bağımsız yönetildiği bir yapı kurar. Flynn sınıflandırması bu makineleri tek bir kutuya yerleştirmeye yetmez, ancak yapının hangi düzeyinde ne tür bir koşutluk bulunduğunu anlatmak için hâlâ kullanılır.