Akış işleme - Stream processing

Akış işleme , veri akışı programlamaya , olay akışı işlemeye ve reaktif programlamaya eşdeğer olanvebazı uygulamaların sınırlı bir paralel işlem biçiminden daha kolay yararlanmasına olanak tanıyanbir bilgisayar programlama paradigmasıdır. Bu tür uygulamalar,bir grafik işleme birimindeki kayan nokta birimi veya alan programlanabilir kapı dizileri (FPGA'lar)gibi çoklu hesaplama birimlerini,bu birimler arasındaki tahsisi, senkronizasyonu veya iletişimi açıkça yönetmeden kullanabilir.

Akış işleme paradigması, gerçekleştirilebilecek paralel hesaplamayı kısıtlayarak paralel yazılım ve donanımı basitleştirir. Bir veri dizisi (bir akış ) verildiğinde, akıştaki her öğeye bir dizi işlem ( çekirdek işlevleri ) uygulanır. Çekirdek işlevleri genellikle ardışık düzendedir ve harici bellek etkileşimiyle ilişkili bant genişliğindeki kaybı en aza indirmek için en uygun yerel yonga üstü belleğin yeniden kullanımı denenir. Akıştaki tüm öğelere bir çekirdek işlevinin uygulandığı tek biçimli akış tipiktir. Çekirdek ve akış soyutlamaları veri bağımlılıklarını ortaya çıkardığından, derleyici araçları çip üzerinde yönetim görevlerini tamamen otomatikleştirebilir ve optimize edebilir. Akış işleme donanımı, örneğin, bağımlılıklar bilindiğinde doğrudan bellek erişimini (DMA) başlatmak için puan tablosunu kullanabilir . Manuel DMA yönetiminin ortadan kaldırılması, yazılım karmaşıklığını azaltır ve donanım önbelleğe alınmış G/Ç için ilgili bir ortadan kaldırma, aritmetik mantık birimleri gibi özel hesaplama birimleri tarafından hizmete dahil edilmesi gereken veri alanı genişlemesini azaltır .

1980'lerde akış işleme, veri akışı programlama içinde keşfedildi . Bir örnek SISAL dilidir (Tek Atama Dilinde Akışlar ve Yineleme).

Uygulamalar

Akış işleme, geleneksel DSP veya GPU tipi uygulamalar (görüntü, video ve dijital sinyal işleme gibi ) için çok iyi çalışan, ancak daha rastgele veri erişimi ile genel amaçlı işleme için daha az çalışan veri merkezli bir model tarafından yönlendirilen bir uzlaşmadır. veritabanları gibi). Modelde bir miktar esneklikten fedakarlık ederek, sonuçlar daha kolay, daha hızlı ve daha verimli uygulamaya izin verir. Bağlama bağlı olarak, işlemci tasarımı maksimum verimlilik veya esneklik için bir ödünleşim için ayarlanabilir.

Akış işleme, özellikle üç uygulama özelliği sergileyen uygulamalar için uygundur:

  • Hesaplama Yoğunluğu , G/Ç veya global bellek referansı başına aritmetik işlem sayısı. Bugün birçok sinyal işleme uygulamasında 50:1'in oldukça üzerindedir ve algoritmik karmaşıklıkla birlikte artmaktadır.
  • Bir girdi akışının tüm kayıtlarına aynı işlev uygulanırsa ve önceki kayıtlardan sonuçlar beklenmeden bir dizi kayıt aynı anda işlenebilirse, bir çekirdekte Veri Paralelliği vardır.
  • Veri Yerelliği , verilerin bir kez üretildiği, uygulamada bir veya iki kez daha sonra okunduğu ve bir daha asla okunmadığı sinyal ve medya işleme uygulamalarında yaygın olan belirli bir geçici konum türüdür. Çekirdekler arasında geçen ara akışlar ve çekirdek işlevleri içindeki ara veriler, akış işleme programlama modelini kullanarak bu konumu doğrudan yakalayabilir.

Akışlar içindeki kayıt örnekleri şunları içerir:

  • Grafiklerde, her kayıt bir üçgenin tepe noktası, normal ve renk bilgisi olabilir;
  • Görüntü işlemede, her kayıt bir görüntüden tek bir piksel olabilir;
  • Bir video kodlayıcıda, her kayıt bir veri makro bloğunu oluşturan 256 piksel olabilir; veya
  • Kablosuz sinyal işlemede, her kayıt bir antenden alınan bir dizi örnek olabilir.

Her kayıt için sadece girdiden okuyabilir, üzerinde işlem yapabilir ve çıktıya yazabiliriz. Birden çok girişe ve birden çok çıkışa izin verilir, ancak hiçbir zaman hem okunabilir hem de yazılabilir bir bellek parçasına sahip olunamaz.

Önceki paralel paradigmalarla karşılaştırma

Temel bilgisayarlar sıralı bir yürütme paradigmasından başladı. Geleneksel işlemciler bulunmaktadır SISD kavramsal bir seferde sadece bir işlemi gerçekleştirmek anlamına göre,. Dünyanın bilgi işlem ihtiyaçları geliştikçe, yönetilmesi gereken veri miktarı çok hızlı bir şekilde arttı. Ardışık programlama modelinin artan işlem gücü ihtiyacı ile baş edemediği açıktı. Büyük miktarlarda hesaplama yapmak için alternatif yollar bulmak için çeşitli çabalar harcandı, ancak tek çözüm, bir düzeyde paralel yürütmeden yararlanmaktı. Bu çabaların sonucu, (farklı) verilerin birden fazla örneğine bir talimatın uygulanmasına izin veren bir programlama paradigması olan SIMD idi . Çoğu zaman, SIMD bir SWAR ortamında kullanılıyordu. Daha karmaşık yapılar kullanılarak MIMD paralelliği de elde edilebilir .

Bu iki paradigma verimli olsa da, gerçek dünya uygulamaları, bellek hizalama sorunlarından senkronizasyon sorunlarına ve sınırlı paralelliğe kadar sınırlamalarla uğraştı. Yalnızca birkaç SIMD işlemcisi bağımsız bileşenler olarak hayatta kaldı; çoğu standart CPU'lara yerleştirildi.

100 adet 4 bileşenli vektör (yani toplamda 400 sayı) içeren iki diziyi toplayan basit bir program düşünün .

Geleneksel, sıralı paradigma

for (int i = 0; i < 400; i++)
    result[i] = source0[i] + source1[i];

Bu, en tanıdık olan sıralı paradigmadır. Varyasyonlar mevcuttur (iç döngüler, yapılar ve benzeri), ancak nihayetinde bu yapıya kaynarlar.

Paralel SIMD paradigması, paketlenmiş kayıtlar (SWAR)

for (int el = 0; el < 100; el++) // for each vector
    vector_sum(result[el], source0[el], source1[el]);

Bu aslında aşırı basitleştirilmiş. Talimatın vector_sumçalıştığını varsayar . Talimatların özünde bu olmasına rağmen , vektör bileşenlerinin sayısı ve bunların veri formatı gibi pek çok bilgi burada dikkate alınmaz. Bu netlik için yapılır.

Sen bu yöntem deşifre talimatlar sayısını azaltır, ancak görebilirsiniz numElements componentsPerElement * için numElements . Döngü daha az kez çalıştırıldığı için atlama talimatlarının sayısı da azalır. Bu kazanımlar, dört matematiksel işlemin paralel yürütülmesinden kaynaklanır.

Bununla birlikte, paketlenmiş SIMD kaydının belirli bir miktarda veri tutması nedeniyle daha fazla paralellik elde etmek mümkün değildir. Hız yukarıya biraz dört paralel işlemleri gerçekleştirirken yapılmış varsayımı ile sınırlıdır (bu ikisi için ortak olduğunu lütfen unutmayın AltiVec ve SSE ).

Paralel Akış paradigması (SIMD/MIMD)

// This is a fictional language for demonstration purposes.
elements = array streamElement([number, number])[100]
kernel = instance streamKernel("@arg0[@iter]")
result = kernel.invoke(elements)

Bu paradigmada, her bir bileşen bloğunun ayrı ayrı tanımlanması yerine tüm veri kümesi tanımlanır. Veri kümesini tanımlamanın ilk iki satırda olduğu varsayılır. Bundan sonra, kaynak ve çekirdekten sonuç çıkarılır. Basitlik için, giriş ve çıkış verileri arasında 1:1 eşleme vardır, ancak bunun olması gerekmez. Uygulanan çekirdekler de çok daha karmaşık olabilir.

Bu paradigmanın bir uygulaması, bir döngüyü dahili olarak "açabilir". Bu, yüzlerce ALU'yu kolayca kullanarak iş hacminin çip karmaşıklığı ile ölçeklenmesini sağlar. Karmaşık veri kalıplarının ortadan kaldırılması, bu ekstra gücün çoğunu kullanılabilir hale getirir.

Akış işleme, SIMD/MIMD işlemenin bir dalı olsa da, bunlar karıştırılmamalıdır. SIMD uygulamaları genellikle "akış" tarzında çalışabilse de, performansları karşılaştırılabilir değildir: model, kendi başına çok daha yüksek performansa izin veren çok farklı bir kullanım modeli öngörmektedir.

Standart CPU gibi jenerik işlemcilere uygulandığında sadece 1.5x hız artışına ulaşılabileceği kaydedildi. Buna karşılık, geçici akış işlemcileri, temel olarak daha verimli bellek erişimi ve daha yüksek paralel işleme seviyelerine atfedilen, 10 kattan fazla performansa kolayca ulaşır.

Model tarafından izin verilen çeşitli esneklik dereceleri olmasına rağmen, akış işlemcileri genellikle çekirdek veya akış boyutuna bazı sınırlamalar getirir. Örneğin, tüketici donanımı genellikle yüksek hassasiyetli matematik gerçekleştirme yeteneğinden yoksundur, karmaşık dolaylı zincirlerden yoksundur veya yürütülebilecek talimatların sayısında daha düşük sınırlar sunar.

Araştırma

Stanford Üniversitesi akış işleme projeleri, 1999'da başlatılan Stanford Gerçek Zamanlı Programlanabilir Gölgelendirme Projesi'ni içeriyordu. Imagine adlı bir prototip 2002'de geliştirildi. Merrimac adlı bir proje yaklaşık 2004'e kadar sürdü. AT&T , grafik işleme birimleri hızla geliştikçe akışla geliştirilmiş işlemcileri de araştırdı . hem hız hem işlevsellik. Bu ilk günlerden beri, özel donanımların yanı sıra düzinelerce akış işleme dili geliştirilmiştir.

Programlama modeli notları

Paralel işleme alanındaki en acil zorluk, kullanılan donanım mimarisinin türünde değil, söz konusu sistemi gerçek dünya ortamında kabul edilebilir performansla programlamanın ne kadar kolay olacağında yatmaktadır. Imagine gibi makineler, otomatik bağımlılıklar, bellek ayırma ve DMA zamanlaması ile basit tek iş parçacıklı bir model kullanır . Bu, başlı başına MIT ve Stanford'da programcı, araçlar ve donanım arasında optimal bir görev katmanı bulma araştırmasının bir sonucudur . Programcılar, algoritmaları paralel donanıma eşlemede araçları yendi ve araçlar, en akıllı bellek ayırma şemalarını vb. bulmada programcıları yendi. Özellikle endişe verici olan, programcının birden çok çekirdek arasında uygulama bölümleme ile uğraşması ve bunlarla ilgilenmesi gereken Cell gibi MIMD tasarımlarıdır. süreç senkronizasyonu ve yük dengeleme. Verimli çok çekirdekli programlama araçları bugün ciddi şekilde eksik.

SIMD programlamanın bir dezavantajı, Yapı Dizisi (AoS) ve Dizi Yapısı (SoA) sorunuydu . Programcılar genellikle 'gerçek' bir anlamı olan veri yapıları oluşturmak istediler, örneğin:

 // A particle in a three-dimensional space.
struct particle_t {
    float x, y, z;          // not even an array!
    unsigned byte color[3]; // 8 bit per channel, say we care about RGB only
    float size;
    // ... and many other attributes may follow...
};

Olan şu ki, bu yapılar daha sonra işleri güzel bir şekilde organize etmek için diziler halinde birleştirildi . Bu, yapılar dizisidir (AoS). Yapı bellekte düzenlendiğinde, derleyici, tüm yapıların bitişik olacağı, ancak örneğin bir yapı örneğinin "size" özniteliği ile aynı öğe arasında sabit bir kayma olacağı anlamında serpiştirilmiş veriler üretecektir. aşağıdaki örnekten. Ofset, yapı tanımına (ve muhtemelen burada dikkate alınmayan, derleyicinin ilkeleri gibi diğer şeylere) bağlıdır. Başka sorunlar da var. Örneğin, üç konum değişkeni bu şekilde SIMDleştirilemez, çünkü sürekli bellek alanında ayrılacaklarından emin değildir. SIMD işlemlerinin üzerlerinde çalışabilmesini sağlamak için, bunlar bir 'dolu bellek konumunda' veya en azından bir dizide gruplandırılmalıdır. Diğer bir problem, hem "renk" hem de "xyz"nin üç bileşenli vektör miktarlarında tanımlanmasında yatmaktadır. SIMD işlemciler genellikle yalnızca 4 bileşenli işlemleri destekler (ancak bazı istisnalar dışında).

Bu tür sorunlar ve sınırlamalar, standart CPU'larda SIMD hızlandırmasını oldukça kötü hale getirdi. Önerilen çözüm, dizilerin yapısı (SoA) aşağıdaki gibidir:

struct particle_t {
    float *x, *y, *z;
    unsigned byte *colorRed, *colorBlue, *colorGreen;
    float *size;
};

C ile deneyimli olmayan okuyucular için , her tanımlayıcıdan önceki '*' bir işaretçi anlamına gelir. Bu durumda, daha sonra tahsis edilecek olan bir dizinin ilk elemanına işaret etmek için kullanılacaklardır. İçin Java programcıları, bu "[]" denk düşüyor. Buradaki dezavantaj, çeşitli niteliklerin bellekte yayılabilmesidir. Bunun önbellek kayıplarına neden olmadığından emin olmak için çeşitli "kırmızıları", ardından tüm "yeşilleri" ve "mavileri" güncellememiz gerekecek.

Akış işlemcileri için yapıların kullanımı teşvik edilir. Bir uygulama bakış açısından, tüm nitelikler bir miktar esneklikle tanımlanabilir. GPU'ları referans alarak, bir dizi öznitelik (en az 16) mevcuttur. Her öznitelik için uygulama, bileşenlerin sayısını ve bileşenlerin biçimini belirtebilir (ancak şimdilik yalnızca ilkel veri türleri desteklenmektedir). Çeşitli öznitelikler daha sonra bir bellek bloğuna eklenir, muhtemelen aynı özniteliklerin 'ardışık' öğeleri arasında bir adım tanımlayarak , araya eklenmiş verilere etkin bir şekilde izin verir. GPU akış işlemeye başladığında, tüm çeşitli öznitelikleri tek bir parametre kümesinde toplar (genellikle bu bir yapı veya "sihirli küresel değişken" gibi görünür), işlemleri gerçekleştirir ve sonuçları daha sonra kullanılmak üzere bir bellek alanına dağıtır . işleme (veya alma).

Daha modern akış işleme çerçeveleri, verileri gerçek bir akış olarak yapılandırmak için FIFO benzeri bir arabirim sağlar. Bu soyutlama, çalışma zamanının/donanımın verimli hesaplama için bu bilgiden tam olarak yararlanmasını sağlarken, veri bağımlılıklarını dolaylı olarak belirtmek için bir araç sağlar. C++ için bugüne kadarki en basit ve en verimli akış işleme yöntemlerinden biri , bağımsız işlem çekirdeklerini C++ akış operatörlerini kullanarak bir veri akışı grafiği olarak birbirine bağlamayı sağlayan RaftLib'dir . Örnek olarak:

#include <raft>
#include <raftio>
#include <cstdlib>
#include <string>

class hi : public raft::kernel
{
public:
    hi() : raft::kernel()
    {
       output.addPort< std::string >( "0" ); 
    }

    virtual raft::kstatus run()
    {
        output[ "0" ].push( std::string( "Hello World\n" ) );
        return( raft::stop ); 
    }
};

int
main( int argc, char **argv )
{
    /** instantiate print kernel **/
    raft::print< std::string > p;
    /** instantiate hello world kernel **/
    hi hello;
    /** make a map object **/
    raft::map m;
    /** add kernels to map, both hello and p are executed concurrently **/
    m += hello >> p;
    /** execute the map **/
    m.exe();
    return( EXIT_SUCCESS );
}

Akış işleme için hesaplama modelleri

Yüksek seviyeli dillerde akış uygulamalarını belirtmenin yanı sıra, hesaplama modelleri (MoC'ler), veri akışı modelleri ve süreç tabanlı modeller olarak da yaygın olarak kullanılmaktadır .

Genel işlemci mimarisi

Tarihsel olarak, CPU'lar, nispeten yavaş büyüyen harici bellek bant genişliğine kıyasla sürekli artan performans nedeniyle çeşitli bellek erişim optimizasyonu katmanları uygulamaya başladı. Bu boşluk genişledikçe, bellek gecikmelerini gizlemek için büyük miktarda kalıp alanı ayrıldı. Bu birkaç ALU'ya bilgi ve işlem kodları getirmek pahalı olduğundan, gerçek matematiksel makinelere çok az kalıp alanı ayrılmıştır (kabaca bir tahmin olarak, bunun %10'dan az olduğunu düşünün).

Akış işlemcilerinde de benzer bir mimari var ama yeni programlama modeli sayesinde yönetime ayrılan transistör miktarı aslında çok az.

Tüm sistem bakış açısından başlayarak, akış işlemcileri genellikle kontrollü bir ortamda bulunur. GPU'lar bir eklenti kartında bulunur (bu, Imagine için de geçerlidir ). CPU'lar sistem kaynaklarını yönetme, uygulamaları çalıştırma ve benzeri kirli işleri yapar.

Akış işlemcisi genellikle hızlı, verimli, tescilli bir bellek veriyolu ile donatılmıştır (çapraz çubuk anahtarları artık yaygındır, geçmişte çoklu veri yolları kullanılmıştır). Bellek şeritlerinin tam miktarı, pazar aralığına bağlıdır. Bu yazıldığı gibi, (giriş seviyesi) etrafında hala 64-bit genişliğinde ara bağlantılar var. Orta sınıf modellerin çoğu, hızlı bir 128 bit çapraz çubuk anahtar matrisi (4 veya 2 segment) kullanırken, üst düzey modeller, 256 bit genişliğinde biraz daha yavaş bir çapraz çubukla büyük miktarda bellek (aslında 512 MB'a kadar) kullanır. Buna karşılık, Intel Pentium'dan bazı Athlon 64'e kadar olan standart işlemciler yalnızca 64 bit genişliğinde tek bir veri yoluna sahiptir.

Bellek erişim kalıpları çok daha öngörülebilir. Diziler var olsa da, boyutları çekirdek çağrısında sabitlenir. Birden çok işaretçi dolaylı ile en yakından eşleşen şey, en sonunda belirli bir bellek alanından (bir akış içinde) okuma veya yazma garantili olan bir dolaylı zincirdir .

Akış işlemcinin yürütme birimi (ALU kümeler) SIMD doğa için, okuma / hafızası bu bir farktır (yüksek bant genişliği yerine, düşük gecikme için optimize edilmiştir, böylece yazma işlemleri, toplu olarak gerçekleşmesi beklenir Rambus'un ve DDR SDRAM için, örnek). Bu aynı zamanda verimli bellek veri yolu görüşmeleri sağlar.

Bir akış işlemcisinin işinin çoğu (%90) çip üzerinde yapılır ve küresel verilerin yalnızca %1'inin belleğe depolanmasını gerektirir. Çekirdek geçicilerini ve bağımlılıklarını bilmenin ödediği yer burasıdır.

Dahili olarak, bir akış işlemcisi bazı akıllı iletişim ve yönetim devrelerine sahiptir, ancak ilginç olan Akış Kayıt Dosyasıdır (SRF). Bu kavramsal olarak, akış verilerinin yığınlar halinde harici belleğe aktarılmak üzere depolandığı büyük bir önbellektir. Çeşitli ALU'lar için önbelleğe benzer yazılım kontrollü bir yapı olarak SRF, çeşitli ALU kümelerinin tümü arasında paylaşılır. Burada Stanford'un Imagine çipiyle yapılan anahtar kavram ve yenilik, derleyicinin belleği programlayıcı için tamamen şeffaf bir şekilde otomatikleştirip tahsis edebilmesidir. Çekirdek işlevleri ve veriler arasındaki bağımlılıklar, derleyicinin akış analizi gerçekleştirmesini ve SRF'leri en iyi şekilde paketlemesini sağlayan programlama modeli aracılığıyla bilinir. Genellikle, bu önbellek ve DMA yönetimi, bir projenin takviminin çoğunu kaplayabilir, akış işlemcisinin (veya en azından Imagine'in) tamamen otomatikleştirdiği bir şey. Stanford'da yapılan testler, derleyicinin, çok çaba sarf ederek elle ayarlamaktan daha iyi veya daha iyi bir iş çıkardığını gösterdi.

Kanıt var; kümeler arası iletişimin nadir olduğu varsayıldığından çok sayıda küme olabilir. Ancak dahili olarak, küme içi iletişim yaygın olduğundan ve bu nedenle yüksek verimli olması gerektiğinden, her küme çok daha düşük miktarda ALU'dan verimli bir şekilde yararlanabilir.

Bu ALU'ları verilerle birlikte tutmak için, her ALU, temelde kendi kullanılabilir kayıtları olan yerel kayıt dosyaları (LRF'ler) ile donatılmıştır.

Bu üç katmanlı veri erişim modeli, geçici verileri yavaş belleklerden uzak tutmayı kolaylaştırır, böylece silikon uygulamasını son derece verimli ve güç tasarrufu sağlar.

Döngüdeki donanım sorunları

Her ne kadar bir büyüklük sırasına göre hızlanma makul bir şekilde beklenebilse de (akış şeklinde hesaplama yaparken ana akım GPU'lardan bile), tüm uygulamalar bundan faydalanmaz. İletişim gecikmeleri aslında en büyük sorundur. PCI Express bunu tam çift yönlü iletişimle geliştirmiş olsa da , bir GPU'nun (ve muhtemelen genel bir akış işlemcisinin) çalışmasını sağlamak muhtemelen uzun zaman alacaktır. Bu, bunları küçük veri kümeleri için kullanmanın genellikle ters etki yaratacağı anlamına gelir. Çekirdeği değiştirmek oldukça pahalı bir işlem olduğundan, akış mimarisi ayrıca kısa akış etkisi olarak adlandırılan bir davranış olan küçük akışlar için cezalara neden olur .

Boru hattı, 200 aşamayı aşan boru hatlarına sahip GPU'larla, akış işlemcilerinde çok yaygın ve yoğun olarak kullanılan bir uygulamadır. Ayarları değiştirmenin maliyeti, değiştirilen ayara bağlıdır, ancak artık her zaman pahalı olduğu düşünülmektedir. Boru hattının çeşitli seviyelerinde bu sorunlardan kaçınmak için "über gölgelendiriciler" ve "doku atlasları" gibi birçok teknik kullanılmıştır. Bu teknikler GPU'ların doğası gereği oyun odaklıdır, ancak kavramlar genel akış işleme için de ilgi çekicidir.

Örnekler

  • Blitter Commodore Amiga 16 bileşeni bit vektörleri kapsayan bir çıkış akımının üretilmesi için 256 yönden 16 bileşeni bit vektörler üç kaynak akımı birleştiren edebilen bir erken (1985 dolaylarında) grafik işlemcisi. Toplam giriş akışı bant genişliği saniyede 42 milyon bit'e kadardır. Çıkış akışı bant genişliği saniyede 28 milyon bit'e kadardır.
  • Profesör başkanlığında, Imagine William Dally ait Stanford Üniversitesi , esnek mimari hızlı ve enerji tasarruflu hem olması amaçlanmıştır olduğunu. İlk olarak 1996 yılında tasarlanan proje, mimariyi, yazılım araçlarını, bir VLSI uygulamasını ve bir geliştirme kartını içeriyordu ve DARPA , Intel ve Texas Instruments tarafından finanse edildi .
  • Merrimac adlı başka bir Stanford projesi, akış tabanlı bir süper bilgisayar geliştirmeyi amaçlıyor. Merrimac, aynı teknolojiyle oluşturulmuş küme tabanlı bilimsel bilgisayarlara göre birim maliyet başına daha fazla performans sağlamak için bir akış mimarisi ve gelişmiş ara bağlantı ağları kullanmayı amaçlıyor.
  • Fırtına-1 aile Stream işlemcisi, Inc ticari bir dönüş-off Stanford ait düşünün projesinde, bir özellik sunumu sırasında açıklandı ISSCC ailesi 30 GOPs 220 16 bit GOPs için operasyonların (milyarlarca değişen dört üye içeren 2007 saniyede), tümü TSMC'de 130 nanometrelik bir işlemde üretilmiştir . Cihazlar, video konferans , çok işlevli yazıcılar ve dijital video gözetim ekipmanı dahil olmak üzere DSP pazarının en üst seviyesini hedefliyor .
  • GPU'lar , esas olarak AMD ve Nvidia tarafından tasarlanan yaygın, tüketici sınıfı akış işlemcileridir . Akış işleme açısından dikkat edilmesi gereken çeşitli nesiller:
    • R2xx/NV2x öncesi: akış işleme için açık destek yok. Çekirdek işlemleri API'de gizlendi ve genel kullanım için çok az esneklik sağladı.
    • R2xx/NV2x: çekirdek akışı işlemleri açıkça programcının kontrolü altındaydı, ancak yalnızca köşe işleme için (parçalar hala eski paradigmaları kullanıyordu). Hiçbir dallanma desteği esnekliği ciddi şekilde engellemedi, ancak bazı algoritma türleri çalıştırılabilir (özellikle düşük hassasiyetli sıvı simülasyonu).
    • R3xx/NV4x: esnek dallanma desteği, yürütülecek işlem sayısı ve katı özyineleme derinliği ve dizi manipülasyonu konusunda hala bazı sınırlamalar olmasına rağmen.
    • R8xx: Ekleme/tüketim arabelleklerini ve atomik işlemleri destekler. Bu nesil en son teknolojidir.
  • HPC'yi hedefleyen ürün grubu için AMD FireStream marka adı
  • HPC'yi hedefleyen ürün grubu için Nvidia Tesla markası
  • Hücre işlemci gelen STI , bir ittifak , Sony Computer Entertainment , Toshiba Corporation'ın ve IBM , uygun yazılım desteği olan bir dere işlemci gibi işlev görebilir bir donanım mimarisidir. Bir kontrol işlemcisi, PPE (Güç İşleme Elemanı, bir IBM PowerPC ) ve SPE'ler (Sinerjistik İşleme Elemanları) olarak adlandırılan, her biri bağımsız program sayaçlarına ve talimat belleğine sahip, aslında bir MIMD makinesi olan bir dizi SIMD yardımcı işlemcisinden oluşur . Yerel programlama modelinde tüm DMA ve program planlaması programcıya bırakılır. Donanım, yerel iletişim için işlemciler arasında hızlı bir halka veriyolu sağlar. Talimatlar ve veriler için yerel bellek sınırlı olduğundan, bu mimariden etkin bir şekilde yararlanabilen tek programlar ya küçük bir bellek alanı gerektirir ya da bir akış programlama modeline bağlı kalır. Uygun bir algoritma ile Hücrenin performansı saf akış işlemcilerinin performansına rakip olabilir, ancak bu neredeyse her zaman algoritmaların ve yazılımın tamamen yeniden tasarlanmasını gerektirir.

Akış programlama kitaplıkları ve dilleri

Akış işlemcileri için çoğu programlama dili Java, C veya C++ ile başlar ve uygulama geliştiricilerinin çekirdekleri ve/veya akışları etiketlemesine izin vermek için özel talimatlar sağlayan uzantılar ekler. Bu , belirli bir dereceye kadar akış programlama dilleri olarak kabul edilebilecek çoğu gölgeleme dili için de geçerlidir .

Akış programlama dillerinin ticari olmayan örnekleri şunları içerir:

Ticari uygulamalar ya genel amaçlıdır ya da bir satıcı tarafından belirli bir donanıma bağlıdır. Genel amaçlı dil örnekleri şunları içerir:

Satıcıya özel diller şunları içerir:

Olay Tabanlı İşleme

Toplu Dosya Tabanlı İşleme (gerçek akış işlemenin bir kısmını taklit eder, ancak genel olarak çok daha düşük performans)

Sürekli Operatör Akışı İşleme

Akış İşleme Hizmetleri:

Ayrıca bakınız

Referanslar

Dış bağlantılar

  1. ^ Chintapalli, Sanket; Dagit, Derek; Evans, Bobby; Farivar, Rıza; Mezarlar, Thomas; Holderbaugh, Mark; Liu, Zhuo; Nusbaum, Kyle; Patil, Kishorkumar; Peng, Boyang Jerry; Poulosky, Paul (Mayıs 2016). "Akış Hesaplama Motorlarını Karşılaştırma: Storm, Flink ve Spark Akışı". 2016 IEEE Uluslararası Paralel ve Dağıtılmış İşleme Sempozyumu Çalıştayları (IPDPSW) . IEEE. s. 1789-1792. doi : 10.1109/IPDPSW.2016.138 . ISBN'si 978-1-5090-3682-0. S2CID  2180634 .