Tek bir SIMD toplama buyruğu, iki vektördeki dört öğe çiftini koşut olarak işler.

Tek buyruk, çoklu veri (İngilizce: Single Instruction, Multiple Data, kısaca SIMD), tek bir buyruk akışının birden çok veri akışı üzerinde işlem yaptığı paralel hesaplama biçimidir. Aynı işlemin çok sayıda veri öğesine uygulanmasını sağlayarak veri düzeyinde koşutluktan yararlanır. SIMD, Flynn sınıflandırmasında bir bilgisayar düzenini tanımlar; günümüzde terim ayrıca işlemcilerdeki kısa vektör buyrukları için de kullanılır.

SIMD; görüntü, ses ve sayısal sinyal işleme gibi aynı işlemin düzenli veri kümeleri üzerinde yinelendiği alanlarda kullanılır. Koşullu dallanmalar ya da düzensiz bellek erişimleri ise işlem şeritlerinin bir bölümünü kullanılamaz bırakarak verimi düşürebilir.

SIMD düşüncesi 1970'lerin dizi işlemcilerinde ve vektör süper bilgisayarlarında doğdu; 1990'larda çokluortam yükleri artınca genel amaçlı işlemcilere kısa vektör uzantıları olarak girdi ve bugün yaygın buyruk kümesi ailelerinin hepsinde bulunuyor. Grafik işlemciler de aynı veri düzeyinde koşutluktan, şeritleri ayrı iş parçacıkları gibi gösteren bir yürütme düzeniyle yararlanır. Yazılım tarafında SIMD buyrukları ya derleyicinin döngüleri kendiliğinden vektörleştirmesiyle ya da programcının belirli buyruklara karşılık gelen yerleşik işlevleri çağırmasıyla üretilir.

Flynn sınıflandırması

Michael J. Flynn, bilgisayar düzenlerini buyruk ve veri akışlarının sayısına göre dört sınıfa ayırmıştır:

Kısaltma Açılım Türkçe Açıklama
SISD Single Instruction, Single Data Tek buyruk, tek veri Tek buyruk akışı tek veri akışını işler.
SIMD Single Instruction, Multiple Data Tek buyruk, çoklu veri Tek buyruk akışı birden çok veri akışını işler.
MISD Multiple Instruction, Single Data Çoklu buyruk, tek veri Birden çok buyruk akışı tek veri akışını işler; uygulamada nadirdir.
MIMD Multiple Instruction, Multiple Data Çoklu buyruk, çoklu veri Birden çok buyruk akışı bağımsız veri akışlarını işler; çok çekirdekli işlemciler bu sınıfa girer.

Çalışma ilkesi

Kısa vektörlü bir SIMD biriminde birden çok veri öğesi geniş bir yazmacın ayrı şeritlerine yerleştirilir. Tek bir aritmetik buyruk bütün şeritlerde aynı işlemi yürütür. Örneğin 128 bitlik bir yazmaç 16 adet 8 bitlik, 8 adet 16 bitlik ya da 4 adet 32 bitlik öğe barındırabilir; bir toplama buyruğu karşılık gelen öğe çiftlerini birlikte toplar.

SIMD ile vektör işleme yakından ilişkilidir ancak bütünüyle eş anlamlı değildir. İşlemci uzantılarındaki SIMD buyruklarının öğe sayısı çoğunlukla yazmaç genişliğiyle sınırlıyken, geleneksel vektör işlemciler daha uzun vektörleri boru hatlı işlem birimlerinde işler.

Tarihçe

Büyük bilgisayarlar

SIMD, mikroişlemcilerden önce büyük bilgisayarlarda ortaya çıktı. 1960'ların sonunda tasarlanan ILLIAC IV'te tek bir denetim birimi, her biri kendi yerel belleğine sahip işlem birimlerini aynı buyrukla yönetiyordu; koşutluk buyruk akışında değil veri akışındaydı. Makinenin 1968'de yayımlanan tasarımı 256 işlem birimi öngörüyordu. Her birimin saniyede dört milyon buyruk yürütmesiyle makinenin toplamda saniyede bir milyar işleme ulaşması hedefleniyordu.

1970'lerin vektör süperbilgisayarları aynı fikri başka bir yoldan kurdu. Cray-1 gibi makinelerde uzun vektör yazmaçları boru hatlı işlem birimlerine beslendi; tek bir buyruk çok sayıda öğeyi ardışık ama kesintisiz işledi. Cray-1'in Fortran derleyicisi en içteki döngüleri kendiliğinden vektörleştiriyordu. Bunun için kaynak programda değişiklik ya da standart dışı bir deyim gerekmiyordu; kullanıcıların yıllarca emek verdiği programlar vektör donanımından yeniden yazılmadan yararlanabiliyordu.

Çokluortam uzantıları

Mikroişlemcilere SIMD'yi getiren şey 1990'ların çokluortam iş yükleri oldu. Görüntü, ses ve video işlemede veriler çoğunlukla 8 ya da 16 bitlik küçük tam sayılardır ve aynı işlem uzun diziler boyunca yinelenir. Altmış dört bitlik bir yazmaç sekiz adet 8 bitlik örneği birden taşıyabildiği için tek bir buyruk sekiz işlemi birden yapabilir.

İlk örneklerden biri Hewlett-Packard'ın PA-RISC işlemcilerine eklediği küçük bir çokluortam buyruk kümesiydi (MAX). 1995'te yayımlanan bir çalışmaya göre bu buyruklar işlemcide kayda değer bir değişiklik gerektirmedi ve giriş düzeyindeki bir iş istasyonunda MPEG görüntü ve sesinin yalnızca yazılımla saniyede 30 kare hızında çözülmesini sağladı. 64 bitlik PA-RISC 2.0 mimarisindeki MAX-2 aynı yaklaşımı sürdürdü: tek bir yazmaca paketlenmiş daha dar veriler üzerinde koşut işlem, genel amaçlı bir işlemciye neredeyse hiç ek maliyet getirmeden yapılabiliyordu.

Sun Microsystems, SPARC V9 buyruk kümesine görsel buyruk kümesi VIS'i ekledi; bu kümenin ilk gerçeklemesi UltraSPARC işlemcisiydi. Tasarımcıları, yaygın kullanılan bazı çokluortam algoritmalarının VIS ile yedi kata varan oranda hızlandığını bildirdi.

Intel'in MMX uzantısı paketlenmiş tam sayı işlemlerini var olan kayan noktalı yazmaçların üzerine kurdu. Uzantıyı tasarlayanlar 1996'da yayımladıkları makalede bütün bir uygulamada 1,5 ile 2 kat arasında hızlanma bildirdi. AMD'nin 21 yeni buyruktan oluşan 3DNow! teknolojisi ise kayan noktalı işlemin ağır bastığı yüklere yönelmişti; ilk gerçeklemesi AMD-K6-2 işlemcisiydi. Intel'in Şubat 1999'da tanıttığı Pentium III, SSE adlı uzantısıyla 70 yeni buyruk getirdi. İşlemcinin tasarımcıları bu buyrukları gerçeklerken kırmık alanı ve saat sıklığı hedefleri yüzünden bir dizi ödünleşime gitti.

Aynı dönemde Silicon Graphics MIPS mimarisine MDMX'i, Digital ise Alpha mimarisine MVI'yı ekledi. Bu dizinin tasarımcılarınca en kapsamlısı olarak nitelenen üyesi, PowerPC için tanımlanan AltiVec oldu. Arm mimarilerinde aynı işi Neon görür.

Genişlik ve ölçeklenebilirlik

Yazmaç genişliği kuşakları. Çubuk uzunlukları bit sayısıyla orantılıdır. Ölçeklenebilir uzantılarda genişlik buyruk kümesine yazılmaz.

Bundan sonrası büyük ölçüde yazmaç genişliğinin tarihidir. Altmış dört bitlik MMX yazmaçlarını SSE ile 128 bit, AVX ile 256 bit, AVX-512 ile 512 bit izledi. Her genişleme beraberinde yeni buyruklar getirdi. Genişlik buyruk kümesine gömülü olduğu için dar yazmaçlara göre derlenmiş bir program geniş yazmaçlardan kendiliğinden yararlanamadı; yazılımın yeniden derlenmesi gerekti.

2010'ların ikinci yarısında bu bağ gevşetildi. Arm'ın ölçeklenebilir vektör uzantısında (SVE) vektör uzunluğu buyruklara yazılmaz; program uzunluktan bağımsız yazılır ve aynı ikili dosya farklı genişlikteki donanımda çalışabilir. RISC-V International, RISC-V vektör uzantısının belirtimini Aralık 2021'de onayladı.


Gerçeklemeler

İşlemci buyruk kümeleri

Çağdaş işlemciler SIMD işlemlerini buyruk kümesi uzantılarıyla sunar:

  • MMX (Intel, 1997), 64 bitlik yazmaçlarda paketlenmiş tamsayı işlemleri sağladı. Teknoloji 1996'da duyuruldu; MMX'li ilk Pentium işlemci Ocak 1997'de tanıtıldı.
  • SSE (Intel, 1999), 128 bitlik yazmaçlar ve kayan noktalı vektör işlemleri ekledi; SSE2, SSE3 ve SSE4 ile genişletildi.
  • AVX (Intel ve AMD), ilk sürümünde 256 bitlik yazmaçlar kullandı; AVX-512 uzantıları 512 bitlik işlemler tanımlar.
  • AltiVec (Apple, IBM ve Motorola), PowerPC mimarisi için tanımlanan vektör uzantısıdır; 128 bitlik vektör yazmaçlarıyla çokluortam işlemlerini hızlandırır.
  • Neon, Arm mimarileri için gelişmiş SIMD buyrukları ve yazmaçları tanımlar.

Grafik işlemciler ve SIMT

Grafik işlem birimleri, SIMD'ye benzeyen ancak programcıya bağımsız iş parçacıkları sunan SIMT (tek buyruk, çoklu iş parçacığı) modelini kullanabilir. SIMD vektör düzenlerinde genişlik yazılıma görünürken SIMT'de buyruklar tek bir iş parçacığının yürütme ve dallanma davranışını belirtir. CUDA gibi programlama ortamları bu modele dayanır: programcı tek bir iş parçacığı için kod yazar, şerit sayısı koda girmez. Aynı yürütme öbeğindeki iş parçacıkları farklı dallara ayrıldığında donanım yolları ayrı ayrı yürütür ve kullanılmayan şeritleri geçici olarak devre dışı bırakır.

Vektör işlemciler

Vektör işlemciler de tek bir buyruğu çok sayıda veri öğesine uygular ve Flynn sınıflandırmasında SIMD içinde değerlendirilir. Kısa vektörlü SIMD uzantılarından farklı olarak, klasik vektör işlemciler uzun vektörlerdeki işlemleri boru hatlı birimler üzerinden yürütür.

Programlama

SIMD buyrukları dört yoldan kullanılır: derleyicinin döngüleri kendiliğinden vektör buyruklarına çevirmesi, programcının buyruklara karşılık gelen yerleşik işlevleri çağırması, çevirici dilinde elle yazılması, ya da tek bir öğe için yazılan kodun derleyici tarafından şeritlere eşlenmesi.

Kendiliğinden vektörleştirme

Bir döngüyü vektörleştirmek için derleyicinin yinelemelerin birbirinden bağımsız olduğunu kanıtlaması gerekir. Bunu engelleyen başlıca durumlar şunlardır:

  • Yinelemeler arası veri bağımlılığı. Bir yineleme bir öncekinin yazdığı değeri okuyorsa öğeler aynı anda işlenemez.
  • İşaretçilerin örtüşmesi. Derleyici iki işaretçinin bellekte aynı yeri gösterip göstermediğini bilmiyorsa bağımsızlığı varsayamaz.
  • Döngü sayısının derleme zamanında bilinmemesi.
  • Kayan noktalı toplamada sıra. Kayan noktalı toplamanın sonucu toplama sırasına bağlıdır; öğeleri şeritlere bölüp kısmi toplamlar almak sonucu değiştirebileceği için derleyici bu dönüşümü ancak programcı açıkça izin verdiğinde yapar.

Kendiliğinden vektörleştirmenin başarısı ölçülmüştür. Derleyicilerin yakalayabildiği döngüler, elle vektörleştirilebilen döngülerin bir bölümüdür; elle yazılmış SIMD kodu birçok durumda derleyicinin ürettiğinden hızlı kalır. Derleyiciye yardım etmek için dilde yönergeler bulunur; OpenMP'nin simd yönergesi döngünün vektörleştirilebileceğini doğrudan bildirir.

Yerleşik işlevler ve elle yazım

İkinci yol, yerleşik işlevleri (İngilizce: intrinsic) kullanmaktır. Bunlar normal bir işlev çağrısı gibi yazılan ama çağrıya derlenmeyen, derleyicinin doğrudan belirli bir SIMD buyruğuna çevirdiği işlevlerdir. Programcı hangi buyruğun kullanılacağını kendisi belirler, yazmaç atamasını ve buyruk sıralamasını derleyiciye bırakır. Bedeli taşınabilirliktir: bu işlevler belirli bir buyruk kümesine bağlıdır ve başka bir mimaride yeniden yazılmaları gerekir. Üçüncü yol olan çevirici dilinde yazım en çok denetimi verir, aynı ölçüde de bakım yükü getirir.

Tek öğe için yazma

Dördüncü yolda programcı bir öğe üzerinde çalışan kod yazar; şeritlere dağıtmayı derleyici üstlenir ve şerit sayısı kaynak koda girmez. Grafik işlemcilerde CUDA bu modelin yaygın örneğidir. Aynı yaklaşım işlemciler için de kullanılmıştır; ISPC derleyicisi tek öğe için yazılmış programı SIMD buyruklarına çevirir. Bu yol, genişliği koddan ayırması bakımından ölçeklenebilir vektör uzunluğuyla aynı amacı güder; ayrıldığı nokta, genişliğin buyruk kümesinde değil derleyicide gizlenmesidir.

Hizalama ve artık döngü

SIMD yükleme ve saklama buyrukları verinin bellekte belirli bir sınıra hizalanmış olmasını bekleyebilir; hizasız erişim daha yavaş olabilir ya da ayrı bir buyruk gerektirir. Dizinin uzunluğu şerit sayısının katı değilse sondaki öğeler tam bir vektör doldurmaz. Kalan bu öğeler, ya tek tek işleyen kısa bir artık döngüyle ya da kullanılmayan şeritleri kapatan bir maskeyle ele alınır.

Dil ve çalışma zamanı desteği

Yerleşik işlevlerle yazılan kod tek bir buyruk kümesine bağlı kaldığı için, dil kitaplıkları taşınabilir veri koşutluğu türleri sunar. Programcı belirli bir buyruğu değil bir vektör türünü kullanır; hangi buyrukların üretileceğine derleyici hedef mimariye bakarak karar verir. C++ için bu türler bir ISO teknik belirtiminde tanımlanmıştır.

Bir başka yol, aynı işlevin birden çok sürümünü derlemektir. Her sürüm ayrı bir uzantıya göre üretilir; derleyici bunların yanına bir çözücü koyar ve program başlatılırken bağlayıcı işlemcinin hangi uzantıları desteklediğine bakarak uygun sürümü seçer. Böylece geniş yazmaçlı bir işlemcide çalışan program bunlardan yararlanırken, eski bir işlemcide aynı dosya çalışmayı sürdürür. Ölçeklenebilir vektör uzunluğunun ortadan kaldırdığı zorunluluk tam olarak budur.

SIMD, tarayıcıda çalışan koda da girmiştir. WebAssembly belirtimi 128 bitlik bir vektör türü ve bu tür üzerinde çalışan buyruklar tanımlar; böylece ağ üzerinden gelen kod da veri düzeyinde koşutluktan yararlanabilir.

Doymalı aritmetik

Şeritlere yerleştirilen öğeler dar olduğu için taşma sıradan bir durumdur. Sekiz bitlik işaretsiz bir öğede 250 ile 10'un toplamı gösterilebilen aralığın dışına çıkar; olağan tam sayı aritmetiğinde sonucun yalnızca alt bitleri saklanır ve değer başa döner. Çokluortam verisinde bu davranış görünür bir bozulma üretir: aydınlatılan bir görüntü noktası en parlak değeri aştığında koyulaşır.

SIMD buyruk kümeleri bu yüzden doymalı aritmetik (İngilizce: saturating arithmetic) sunar. Sonuç gösterilebilen aralığın dışına çıktığında başa dönmek yerine aralığın ucunda tutulur; sekiz bitlik işaretsiz toplamada üst uçta 255, alt uçta 0 yazılır. MMX'in tanımladığı paketlenmiş tam sayı buyruklarının bir bölümü bu biçimde çalışır. AltiVec de toplama, çıkarma ve tür dönüştürme buyruklarının doymalı biçimlerini tanımlar.

Doymalı biçimin ikinci yararı denetim yükünü azaltmasıdır. Taşmayı öğe başına sınamak şeritten şerite değişen bir karar demektir; bir SIMD buyruğu bütün şeritlerde aynı işi yaptığı için böyle bir karar ancak ek buyruklarla ele alınabilir. Sınırlama işlemin kendisine gömüldüğünde bu ek iş ortadan kalkar.

Koşullu işlemler ve veri düzenleme

Maskeleme

Koşulun tutmadığı şerit maskeyle kapatılır; o şeridin sonucu hedefe yazılmaz ve değeri değişmeden kalır.

Bir SIMD buyruğu bütün şeritlerde aynı işlemi yürüttüğü için şeritler birbirinden ayrı dallanamaz. Öğelerin bir bölümüne uygulanması gereken bir koşul iki yoldan ele alınır. Birincisi koşullu seçimdir: her iki dalın sonucu da hesaplanır, sonra şerit başına hangisinin tutulacağı seçilir. İkincisi maskelemedir: hangi şeritlerin yazılacağını belirten bir maske değeri buyruğa verilir, maskede kapalı görünen şeritlerin sonucu hedefe yazılmaz.

AVX-512 bu iş için ayrı maske yazmaçları tanımlar; buyrukların çoğu, sonucun hangi şeritlere yazılacağını söyleyen bir maske işleneni alabilir. SVE'de aynı görevi koşul yazmaçları (İngilizce: predicate register) üstlenir. SVE bunları yalnızca koşullu işlemlerde değil döngü denetiminde de kullanır; son yinelemede dizinin sonunu aşan şeritler maskeyle kapatıldığı için ayrı bir artık döngü yazmak gerekmez.

Maskeleme koşutluğu korumaz, yalnızca doğruluğu sağlar. Bir koşulun iki dalı da hesaplandığında ya da şeritlerin bir bölümü kapatıldığında, kapalı şeritlerin iş görmediği çevrimler boşa gider; kazanç, koşulun şeritler arasında ne kadar aynı yönde gittiğine bağlıdır.

Veri düzenleme

SIMD buyrukları öğelerin bellekte yan yana durduğunu varsayar. Gerçek programlarda veri çoğu zaman böyle durmaz ve yeniden düzenlenmesi gerekir.

Bir yazmacın içindeki öğelerin yerini değiştiren buyruklar, aynı veriyi farklı bir sırayla işleyebilmeyi sağlar. Bellekte dağınık duran öğeler için ise tek buyrukla çok sayıda adresten okuma (İngilizce: gather) ve çok sayıda adrese yazma (İngilizce: scatter) buyrukları vardır; bunlar yan yana duran veriye erişen buyruklardan belirgin biçimde yavaştır.

Veri yerleşiminin kendisi de bir tasarım kararıdır. Aynı bilgi, alanları bir arada tutan yapılardan oluşan bir dizi olarak da, her alanı ayrı bir dizide tutan bir düzen olarak da saklanabilir. İkincisinde ardışık öğelerin aynı alanı bellekte yan yana geldiği için bir SIMD yazmacına doğrudan yüklenebilir; birincisinde her öğeden yalnızca bir alan gerektiğinde araya istenmeyen baytlar girer.

Şeritler arası indirgeme

Bir SIMD buyruğu her şeridi ayrı tutar; oysa bir dizinin toplamı, en büyük öğesi ya da iki vektörün karşılıklı öğe çarpımlarının toplamı gibi hesaplar tek bir sonuç ister. Böyle bir hesapta döngü şeritler üzerinde kısmi değerler biriktirir, döngü bittikten sonra da bu kısmi değerler tek bir değere indirgenir. Yaygın biçim, yazmacın üst yarısını alt yarısına eklemeyi şerit sayısının ikili logaritması kadar yinelemektir.

Kayan noktalı veride indirgeme sonucu değiştirebilir. Kayan noktalı toplamanın birleşme özelliği yoktur; toplama sırası değiştiğinde yuvarlama hataları farklı birikir ve sonuç, öğeleri tek tek toplayarak elde edilene eşit çıkmayabilir. Derleyici bu yüzden kayan noktalı bir indirgemeyi kendiliğinden vektörleştirmez; sıranın değişmesine izin verildiğinin programcı tarafından bildirilmesi beklenir. OpenMP'nin vektörleştirme yönergeleri bunun için ayrı bir indirgeme bildirimi taşır.

Ölçeklenebilir vektör uzunluğu

Alışılmış SIMD uzantılarında yazmaç genişliği buyruk kümesinin bir parçasıdır. Yüz yirmi sekiz bitlik bir buyruk yalnızca o genişlikteki yazmaçla çalışır; donanım genişlediğinde yeni buyruklar tanımlanır ve eski programın yeniden derlenmesi gerekir.

Ölçeklenebilir uzunluk yaklaşımında genişlik buyruklara yazılmaz. Program vektörün kaç öğe taşıdığını çalışma sırasında donanıma sorar ve döngüsünü buna göre kurar. Aynı ikili dosya dar ve geniş gerçeklemelerin ikisinde de çalışır, geniş olanda her yinelemede daha çok öğe işler. Arm'ın SVE uzantısı bu yolu izler; döngü denetimi koşul yazmaçlarıyla yapıldığından dizinin sonunda kalan öğeler de ayrı bir artık döngü gerektirmez.

Bunun yazılım dağıtımındaki karşılığı doğrudandır. Genişliğin buyruk kümesine gömülü olduğu düzende bir programın aynı işlevi yapan birkaç ayrı sürümü derlenir ve hangisinin çalışacağına iş başladığında karar verilir. Uzunluktan bağımsız bir buyruk kümesinde tek bir sürüm yeter.

RISC-V'in vektör uzantısı da aynı ilkeye dayanır; uzantının 1.0 sürümüne göre tasarlanmış açık kaynaklı gerçeklemeler yayımlanmıştır.

Yaklaşımın bedeli yazılım tarafındadır. Genişliği sabit varsayarak yazılmış mevcut SIMD kodu ölçeklenebilir bir mimariye kendiliğinden taşınmaz; böyle bir kodun çevrilmesi başlı başına bir araştırma konusu olmuştur.

Piyasadaki gerçeklemeler

Aynı buyruk kümesi ailesi ürünler arasında farklı genişliklerde ve farklı kapsamlarda gerçeklenir; bir uzantının tanımlanmış olması, o uzantıyı her işlemcinin desteklediği anlamına gelmez.

x86 tarafında MMX ile başlayan uzantı dizisi hem Intel hem AMD işlemcilerinde bulunur. En geniş olanı, 512 bitlik AVX-512, Intel tarafından öncelikle sunucu ürünlerinde öne çıkarılmıştır. Bir uzantının ürün hatlarına göre değişmesi, yazılımın hangi genişliğe güvenebileceğini belirsiz bırakır; çalışma zamanında sürüm seçmenin yaygınlaşma nedeni budur.

Arm mimarilerinde Neon, uygulama işlemcilerinde bulunan gelişmiş SIMD buyruk kümesidir. Ölçeklenebilir uzantı SVE'nin ilk büyük ölçekli gerçeklemesi Fujitsu'nun A64FX işlemcisidir; bu işlemci Fugaku süper bilgisayarında kullanılmış ve tasarımı bu makineyle birlikte yürütülmüştür.

RISC-V tarafında vektör uzantısının 1.0 sürümüne göre tasarlanmış açık kaynaklı işlemci gerçeklemeleri yayımlanmıştır.

Kullanım alanları

SIMD'den kazanç sağlayan işlerin ortak yanı, aynı işlemin düzenli yerleşmiş çok sayıda veri öğesine uygulanmasıdır.

Çokluortam ve sinyal işleme

Uzantıları mikroişlemcilere sokan alan budur. Görüntüde her noktanın, seste her örneğin aynı işlemden geçmesi SIMD'nin varsaydığı yapıya doğrudan uyar; veri öğeleri küçük tam sayılar olduğu için tek bir yazmaca çok sayısı sığar. Sıkıştırma, süzgeçleme ve renk dönüşümü gibi adımlar bu yolla hızlandırılır.

Bilimsel hesaplama

Yoğun doğrusal cebir işlemleri, özellikle matris çarpımı ve vektör toplamı, SIMD için elverişlidir; öğeler bellekte düzenli aralıklarla durur ve aralarında bağımlılık yoktur. Bilimsel hesaplamada kullanılan sayısal kitaplıkların çekirdek döngüleri çoğunlukla elle vektörleştirilmiş durumdadır.

Yapay öğrenme

Yapay sinir ağlarının çıkarım adımı da aynı desende çalışır ve düşük bitli tam sayılarla yürütüldüğünde bir yazmaca çok sayıda ağırlık sığar. Bununla birlikte bu iş yükünün ağırlık merkezi, tek başına SIMD'den çok, aynı çarpma toplama örüntüsü için tasarlanmış özel matris birimlerine kaymıştır.

Metin ve veri ayrıştırma

SIMD'nin beklenmedik bir uygulama alanı metin ayrıştırmadır. Ayrıştırma ilk bakışta karakter karakter ilerleyen, dallanma yüklü bir iş gibi görünür; buna karşılık tırnak, kaçış imi ve ayraç gibi imlerin yerleri, karşılaştırma ve maske buyruklarıyla dallanmaya başvurmadan bir defada bulunabilir. Bu yolla saniyede gigabayt ölçüsünde JSON ayrıştıran çözümler yayımlanmıştır.

Donanım gerçeklemesi

Bir SIMD birimi genellikle koşut şeritler olarak kurulur. Her şeridin kendi aritmetik devresi vardır ve hepsi aynı denetim sinyalleriyle sürülür; buyruğu getirme, çözme ve denetim düzeneği tek olduğu için genişleyen şey yalnızca veri yoludur. Tek bir çözme biriminin çok sayıda şeride hizmet etmesi, SIMD'nin buyruk başına daha az denetim yükü taşımasının nedenidir.

Genişlemenin donanım bedeli vardır. Daha geniş yazmaçlar daha büyük bir yazmaç öbeği, daha fazla okuma ve yazma kapısı ve daha geniş veri yolları gerektirir; bunların hepsi alan ve güç harcar.

Bedelin ikinci yanı bellek tarafındadır. Şerit sayısını artırmak ancak bu şeritleri besleyecek veri belleğe zamanında getirilebildiğinde işe yarar. Bir hesaplamanın bellekten getirdiği bayt başına yaptığı işlem sayısına aritmetik yoğunluk denir. Bu değer belirli bir eşiğin altında kaldığında başarım, işlem birimlerinin sayısıyla değil bellek bant genişliğiyle sınırlanır. Çatı çizgisi modeli bu sınırı görünür kılar ve bir çekirdeğin hangi bölgede çalıştığını gösterir.

Bu iki bedel birlikte, yazmaç genişliğinin sürekli artırılmasının her iş yükü için karşılık vermediğini açıklar. Kazanç, iş yükünün aritmetik yoğunluğuna ve verinin şeritlere düzenli yerleşip yerleşmediğine bağlı kalır.

Avantajları ve sınırlamaları

Tek bir buyruk çözümleme ve denetim düzeninin birden çok veri öğesine hizmet etmesi, düzenli hesaplamalarda daha yüksek işlem hacmi ve daha düşük buyruk getirme maliyeti sağlayabilir. Aynı nedenle işlem başına harcanan enerji de düşer: getirme, çözme ve denetim için ödenen bedel tek bir buyruğa ödenir ve bütün şeritlere paylaştırılır. Veri düzeyinde koşutluğun pille çalışan aygıtlarda da aranmasının nedeni budur.

Kazanç, veri öğelerinin şeritlere yerleştirilebilmesine ve aynı işlemi izlemesine bağlıdır. Veri bağımlılıkları, düzensiz bellek erişimleri ve koşula bağlı farklı yürütme yolları kullanılabilir koşutluğu azaltır.

Hızlanmanın üst sınırını belirleyen şey, programın vektörleştirilebilen bölümünün toplam süredeki payıdır. Amdahl yasasına göre bir bölümün hızlandırılmasıyla elde edilen bütünsel kazanç o bölümün payıyla sınırlıdır; süresinin yarısını vektörleştirilemeyen bir bölümde geçiren program, şerit sayısı ne olursa olsun iki kattan çok hızlanamaz. Şerit sayısını artırmak bu yüzden her iş yükünde karşılık vermez.

Sınırlamaların bir bölümü yazılım tarafındadır. Belirli bir uzantının buyruklarıyla elle yazılmış kod, o uzantıyı taşımayan bir işlemcide çalışmaz ve sonradan gelen daha geniş bir uzantıdan kendiliğinden yararlanamaz; kodun bakımı, her hedef için ayrı bir sürümün elde tutulması anlamına gelir.

Ayrıca bakınız

Kaynakça

  1. ^ a b Flynn, Michael J. (Eylül 1972). "Some Computer Organizations and Their Effectiveness". IEEE Transactions on Computers. C-21 (9). ss. 948-960. doi:10.1109/TC.1972.5009071. 
  2. ^ a b c d e f g h i j k l m n o p q r s Hennessy, John L.; Patterson, David A. (2019). Computer Architecture: A Quantitative Approach (6 bas.). Morgan Kaufmann. ISBN 978-0-12-811905-1. 
  3. ^ a b c d e f g h Patterson, David A.; Hennessy, John L. (2021). Computer Organization and Design: RISC-V Edition (2 bas.). Morgan Kaufmann. ISBN 978-0-12-820331-6. 
  4. ^ Barnes, G. H.; Brown, R. M.; Kato, M.; Kuck, D. J.; Slotnick, D. L.; Stokes, R. A. (Ağustos 1968). "The ILLIAC IV Computer". IEEE Transactions on Computers. C-17 (8). ss. 746-757. doi:10.1109/TC.1968.229158. 
  5. ^ Russell, Richard M. (Ocak 1978). "The CRAY-1 computer system". Communications of the ACM. 21 (1). ss. 63-72. doi:10.1145/359327.359336. 
  6. ^ Lee, R. B. (Nisan 1995). "Accelerating multimedia with enhanced microprocessors". IEEE Micro. 15 (2). ss. 22-32. doi:10.1109/40.372347. 
  7. ^ Lee, R. B. (1996). "Subword parallelism with MAX-2". IEEE Micro. 16 (4). ss. 51-59. doi:10.1109/40.526925. 
  8. ^ Kohn, L.; Maturana, G.; Tremblay, M.; Prabhu, A.; Zyner, G. (1995). The visual instruction set (VIS) in UltraSPARC. Digest of Papers. COMPCON'95. ss. 462-469. doi:10.1109/CMPCON.1995.512423. 
  9. ^ Tremblay, M.; O'Connor, J. M.; Narayanan, V.; He, Liang (1996). "VIS speeds new media processing". IEEE Micro. 16 (4). ss. 10-20. doi:10.1109/40.526921. 
  10. ^ a b c d Peleg, A.; Weiser, U. (1996). "MMX technology extension to the Intel architecture". IEEE Micro. 16 (4). ss. 42-50. doi:10.1109/40.526924. 
  11. ^ Oberman, S.; Favor, G.; Weber, F. (1999). "AMD 3DNow! technology: architecture and implementations". IEEE Micro. 19 (2). ss. 37-48. doi:10.1109/40.755466. 
  12. ^ "Intel Launches the Pentium III Processor". Intel. 26 Şubat 1999. 12 Mart 2026 tarihinde kaynağından arşivlendi. Erişim tarihi: 12 Eylül 2026. 
  13. ^ Raman, S. K.; Pentkovski, V.; Keshava, J. (2000). "Implementing streaming SIMD extensions on the Pentium III processor". IEEE Micro. 20 (4). ss. 47-57. doi:10.1109/40.865866. 
  14. ^ a b c Diefendorff, K.; Dubey, P. K.; Hochsprung, R.; Scales, H. (2000). "AltiVec extension to PowerPC accelerates media processing". IEEE Micro. 20 (2). ss. 85-95. doi:10.1109/40.848475. 
  15. ^ a b c "Neon". Arm. 8 Eylül 2026 tarihinde kaynağından arşivlendi. Erişim tarihi: 11 Eylül 2026. 
  16. ^ a b "Intel 64 and IA-32 Architectures Software Developer Manuals". Intel. Erişim tarihi: 11 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
  17. ^ a b c "Intel Advanced Vector Extensions 512 (Intel AVX-512) Overview". Intel. 18 Haziran 2026 tarihinde kaynağından arşivlendi. Erişim tarihi: 12 Eylül 2026. 
  18. ^ a b c d Stephens, N.; Biles, S.; Boettcher, M. (2017). "The ARM Scalable Vector Extension". IEEE Micro. 37 (2). ss. 26-39. doi:10.1109/MM.2017.35. 
  19. ^ "RISC-V International Ratifies 15 New Specifications, Opening Up New Possibilities for RISC-V Designs". RISC-V International. 2 Aralık 2021. 14 Ekim 2024 tarihinde kaynağından arşivlendi. Erişim tarihi: 12 Eylül 2026. 
  20. ^ "Intel Introduces the Pentium Processor with MMX Technology". Intel. 8 Ocak 1997. 11 Şubat 2026 tarihinde kaynağından arşivlendi. Erişim tarihi: 11 Eylül 2026. 
  21. ^ a b c "Advanced Kernel Programming: SIMT Architecture". CUDA Programming Guide. NVIDIA. 5 Eylül 2026 tarihinde kaynağından arşivlendi. Erişim tarihi: 11 Eylül 2026. 
  22. ^ a b Maleki, S.; Gao, Y.; Garzarán, M. J.; Wong, T.; Padua, D. (2011). An Evaluation of Vectorizing Compilers. 2011 International Conference on Parallel Architectures and Compilation Techniques. doi:10.1109/PACT.2011.68. 
  23. ^ a b "OpenMP Specifications". OpenMP Architecture Review Board. Erişim tarihi: 12 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
  24. ^ Pharr, Matt; Mark, William R. (2012). ispc: A SPMD compiler for high-performance CPU programming. 2012 Innovative Parallel Computing (InPar). ss. 1-13. doi:10.1109/InPar.2012.6339601. 
  25. ^ ISO/IEC TS 19570:2018 Programming Languages — Technical Specification for C++ Extensions for Parallelism (2 bas.). Uluslararası Standardizasyon Örgütü. 2018. 
  26. ^ "Function Multiversioning". GCC Kullanım Kılavuzu. Free Software Foundation. Erişim tarihi: 12 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
  27. ^ "WebAssembly Specification, Release 3.0". W3C WebAssembly Topluluk Grubu. 11 Eylül 2026. Erişim tarihi: 12 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
  28. ^ a b Perotti, Matteo; Cavalcante, Matheus; Wistoff, Nils; Andri, Renzo; Cavigelli, Lukas; Benini, Luca (2022). A "New Ara" for Vector Computing: An Open Source Highly Efficient RISC-V V 1.0 Vector Processor Design. 2022 IEEE 33rd International Conference on Application-specific Systems, Architectures and Processors (ASAP). ss. 43-51. doi:10.1109/ASAP54787.2022.00017. 
  29. ^ a b Fu, Sheng-Yu; Hsu, Wei-Chung (2019). Translating Traditional SIMD Instructions to Vector Length Agnostic Architectures. 2019 IEEE/ACM International Symposium on Code Generation and Optimization (CGO). doi:10.1109/CGO.2019.8661195. 
  30. ^ Sato, Mitsuhisa; Ishikawa, Yutaka; Tomita, Hirofumi; Kodama, Yuetsu (2020). Co-Design for A64FX Manycore Processor and "Fugaku". SC20: International Conference for High Performance Computing, Networking, Storage and Analysis. ss. 1-15. doi:10.1109/SC41405.2020.00051. 
  31. ^ Langdale, Geoff; Lemire, Daniel (2019). "Parsing gigabytes of JSON per second". The VLDB Journal. 28 (6). ss. 941-960. doi:10.1007/s00778-019-00578-5. 
  32. ^ Williams, Samuel; Waterman, Andrew; Patterson, David (2009). "Roofline: an insightful visual performance model for multicore architectures". Communications of the ACM. 52 (4). ss. 65-76. doi:10.1145/1498765.1498785.