Cevabımın blog yazısı formatı için şimdiden özür dilerim. Paralel hesaplama dünyasına küçük bir genel bakış yaparken kendime yardım edemedim.
Paralel programlama modellerini kabaca iki kategoride sınıflandırabilirsiniz: kontrol akışı ve veri akışı modelleri.
Kontrol akış modelleri temelde her programlanabilir bilgisayara bugün bir açık-kontrol programının kapsamında paralellik çalışması için deneyin. Ele alınan temel sorun, böyle bir 'Von Neumann mimarisinin' paralel uygulama için değil, sıralı hesaplamalar için tasarlanmasıdır. Bu bağlamda paralellik, temel modüllerin bölümlerinin kopyalanmasıyla elde edilir (bellek, kontrol, aritmetik).
Yalnızca aritmetik kopyalamak size SIMD talimatlarını verir, tüm ALU'lar aynı Program Sayacını (PC) paylaşır ve bu nedenle aynı işlemi farklı verilerde olsa da paralel olarak yürütür.
ALU ve PC'yi çoğaltmak ancak komut sıralayıcıyı kontrol ünitesinde tutmak, size bir miktar boru hattı-paralelliği sağlayan Sıra Dışı (OoO) çalışmasını sağlar. Bu kategoride ayrıca Çok Uzun Öğretim Sözcüğüne (VLWI) ve branche tahmin tekniklerine sahipsiniz. Bu kategoriyi nadiren bir yazılım düzeyinde görüyorsunuz.
Biraz daha ileri gitmek, tüm 'çekirdeği' çoğaltıyor ama hafızayı paylaşmaya devam ediyorlar, bunlar size görev (veya iş parçacığı) paralelliği veren mevcut çok çekirdekli işlemcilerdir. Bu bağlamda belleği paylaşmak size çok, çok zor ve ince eşzamanlılık sorunları verir . Mevcut çok çekirdekli paralel hesaplamalar bu nedenle senkronizasyon / eşzamanlılık problemleri, dikkatli performans dengesi (senkronizasyon yok) ve istenen anlambilim (tamamen senkronize, sıralı çalıştırma anlambilimi) etrafında tamamen döner. Bunun örnekleri, bu gün PAAM ya da daha çok popüler Cilk bu çatal / birleştirme (şekilde ofshoots IntelTBB , Java.Utils.Concurrency). CSP ve Aktör modelleri eşzamanlılık modelleridir, ancak yukarıda belirtildiği gibi eşzamanlılık ve paralellik paylaşılan bellek ortamında bulanıklaşır. nb paralellik performans için, doğru anlambilimi korumak için eşzamanlılık içindir.
Belleği çoğaltmak da size ya MPI ile programlanan ağ bağlantılı bilgisayarları ya da ilkini ya da yonga ağındaki işlemciler (bulut işlemci, Transputer, Tilera) gibi sadece garip Von Neumann mimarileri vermez. UMA veya NUMA gibi bellek modelleri , paylaşılan bellek yanılsamasını korumaya çalışır ve yazılım veya donanım düzeyinde var olabilir. MPI program düzeyinde paralelliği korur ve yalnızca mesaj ileterek iletişim kurar. İleti aktarma, iletişim ve eşzamanlılık için (Donanım) bir donanım düzeyinde de kullanılır.
İkinci kategori veri akışı modelleridir . Bunlar bilgisayar çağının başlangıcında, Von Neumann tasarımından kaçınarak paralel hesaplamaları yazmanın ve uygulamanın bir yolu olarak tasarlandı. Bunlar, sıralı performansın üssel olarak artmasından sonra 80'lerin modası dışına çıktı (paralel hesaplama için). Bununla birlikte, Google MapReduce, Microsoft'un Dryad veya Intel'in Eşzamanlı Koleksiyonları gibi pek çok paralel programlama sistemi aslında veri akışı hesaplama modelleridir. Bir noktada hesaplamaları bir grafik olarak temsil ederler ve uygulamayı yürütmek için kullanırlar.
Modellerin bölümlerini belirleyerek, dataflow modeli için farklı kategoriler ve anlamlar elde edersiniz. Grafiğin şeklini ne ile sınırlandırıyorsunuz: DAG (CnC, Dryad), ağaç (mapreduce), digraph? Sıkı senkronizasyon semantiği var mı ( Parlaklık, reaktif programlama]? Statik bir zamanlamaya (StreaMIT) sahip olmak için özyinelemeye izin vermiyor musunuz veya dinamik bir zamanlayıcıya (Intel CnC) sahip olarak daha anlamlı bir güç sağlıyor musunuz? Gelen veya giden kenarların sayısında bir sınır var mı? Ateşleme semantiği, gelen verinin bir alt kümesi olduğunda düğüme ateşlemeye izin veriyor mu? Kenarları veri akışı (akış işleme) veya tek veri belirteçleri (statik / dinamik tek atama). İlgili çalışmalar için Arvind, K. Kavi, j. Gibi insanların dataflow araştırma çalışmalarına bakarak başlayabilirsiniz. Sharp, W. Ackerman, R. Jagannathan, vb.
Düzenleme: Bütünlüğü uğruna. Paralel olarak indirgenmiş ve paternli modeller de olduğunu belirtmeliyim . Küçültme stratejileri için genel olarak grafik küçültme ve dizi küçültme işlemlerine sahipsiniz. Haskell temelde sıralı bir paylaşımlı bellek sisteminde çok etkili bir strateji olan grafik azaltmayı kullanır. Dize azaltma yinelenenleri çalışır, ancak örtük olarak paralelleştirilmeye daha uygun olmasını sağlayan özel bellek özelliğine sahiptir. Model odaklı modeller, eşzamanlı prolog gibi paralel mantık dilleridir. Aktör modeli aynı zamanda model odaklı bir modeldir, ancak özel hafıza özelliklerine sahiptir.
PS. Hem model hem de programlama amaçlı soyut makineleri kapsayan 'model' terimini geniş bir şekilde kullanıyorum.