SIMD
Tek bir komut akışının birden fazla veri öğesi üzerinde aynı işlemi vektör yazmaçlarıyla paralel yürüttüğü veri-paralel hesaplama modeli.
SIMD (Single Instruction, Multiple Data), aynı aritmetik veya mantıksal işlemi birden fazla veri öğesine tek komutla uygulayan veri paralelliği modelidir.
İşlemci Düzeyinde Ne Olur?
Skaler bir toplama tek sayı çifti üzerinde çalışırken vektör komutu aynı anda birden fazla öğeyi taşıyan yazmaç üzerinde işlem yapabilir. Gerçek genişlik işlemci mimarisine ve veri türüne bağlıdır.
x86 tarafında SSE/AVX ailesi, ARM tarafında NEON/SVE ve POWER mimarisinde AltiVec/VSX bu yaklaşımın örnekleridir.
Gerçek Performansı Belirleyen Etkenler
SIMD kullanılması tek başına hızlanma garantisi değildir. Kazancı belirleyen başlıca etkenler:
- verinin ardışık ve vektörleştirilebilir biçimde yerleşmesi,
- bellek bant genişliği,
- hizalama ve yükleme/saklama maliyeti,
- dallanma ve mask işlemleri,
- scalar remainder veya tail handling,
- derleyicinin otomatik vektörleştirme başarısı.
Bellekten veri yeterince hızlı getirilemiyorsa daha geniş vektör birimi toplam throughput'u artırmayabilir.
Thread Paralelliğinden Farkı
SIMD, birden fazla thread çalıştırmak değildir. Tek komut akışı içindeki veri paralelliğidir. OpenMP gibi thread-level parallelism ile SIMD aynı programda birlikte kullanılabilir.
Kendi uygulama bağlamım için IBM POWER9 AC922, Bilgisayar Mimarisi ve DCT/SIMD görüntü benzerliği çalışmalarına bakılabilir.
İlgili makale: Donanım ve Çoklu Ortam
Vektör Genişliği ile Gerçek Hızlanma Aynı Şey Değildir
W öğeyi aynı anda işleyebilen bir vektör komutu, tamamen vektörleşebilen ve başka darboğazı olmayan ideal bir çekirdekte skaler işe göre en fazla yaklaşık W kat aritmetik paralellik sunar. Programın yalnız p oranı bu biçimde hızlanabiliyorsa, bellek ve diğer giderler yok sayıldığında dahi Amdahl tipi kaba üst sınır:
S <= 1 / ((1-p) + p/W)olur. Örneğin vektör genişliğini iki katına çıkarmak, seri kalan bölüm veya bellek bant genişliği baskınsa uçtan uca süreyi iki kat iyileştirmez.
Bu nedenle SIMD değerlendirmesinde yalnız instruction-set adı değil; vectorized-loop oranı, load/store miktarı, cache miss, memory bandwidth ve scalar tail birlikte ölçülmelidir. OpenMP gibi thread paralelliğiyle birleştiğinde iki paralellik katmanının aynı bellek sistemini paylaştığı da hesaba katılmalıdır.
Yazılım Optimizasyonu Bağlamı
SIMD kazancı yalnız vektör genişliğinden gelmez. Ardışık veri yerleşimi, hizalama, branch yapısı, cache locality ve memory bandwidth aynı anda sonucu belirler. Bir scalar döngünün vectorized sürümü daha az instruction çalıştırdığı halde bellek bant genişliğine dayanıyorsa beklenen hızlanmaya ulaşmayabilir.