Hangi algoritmalar veri paralel operatörleri ile toplam fonksiyonel bir dil kullanılarak ifade edilebilir?


11

Sadece veri türleri sayısal skalerler ve dizilerin keyfi yuvaları olan işlevsel bir programlama dili düşünün. Dilin sınırsız yinelemeden yoksun olması nedeniyle aşağıdakilere izin verilmez:

  • Açık döngüler (yan etkiler olmadan fazla kullanılmaz)
  • yineleme
  • keyfi birinci sınıf fonksiyonlar (y birleştirici yok)

Bununla birlikte, dil:

  • üst düzey fonksiyonlar
  • lexically scoped izin bağlamaları
  • dallanma kontrol akışı
  • ortak skaler matematik ve mantık fonksiyonları
  • x ile aynı değerlere sahip bir n elemanlı dizi oluşturan dolgu (n, x) gibi basit bir dizi yapıcı
  • en önemlisi: paralel yapılandırılmış yineleme (haritalama, azaltma, tarama, tüm çiftler gibi) gerçekleştiren kısıtlı bir üst düzey operatörler kümesi.

Veri paralel operatörleri hakkında daha spesifik olmak gerekirse:

  • y = harita (f, x) => y [i] = f [i]
  • Bazı permütasyon p için y = azaltmak (f, a, x) => y = f (a, f (y [p [0]], f (y [p [1]], ...)))
  • y = tarama (f, a, x) => y [i] = azaltma (f, a, y [0 ... i-1])
  • y = allpairs (f, x, y) => y [i, j] = f (x [i], y [j])

Başka operatörler de olabilirdi, ancak hak kazanmak için polinom çalışma süresine sahip olmalı, bazı makul veri paralel hesaplama modeli altında uygulanabilir olmalı ve çoğu polinom alanında kullanılmalıdır.

Açıkçası bu dilde ifade edilemeyen bazı yapılar vardır, örneğin:

while f(x) > tol:
    x <- update(x)   

Bu sistemde ne ifade edebiliriz? Sadece FP'deki arama problemleriyle sınırlı mıyız? Tüm polinom zaman algoritmalarını yakalayabilir miyiz? Ayrıca, bu sınıf için çok az sayıda operatör var mı?

Yanıtlar:


7

Bu fikirleri ciddiye alan eski programlama dili NESL'ye bakmak isteyebilirsiniz . Dil, koleksiyonlar üzerindeki işlemlere dayanmaktadır, esas olarak listeler ve listeler vb. Bu projede yapılan bazı araştırmalar (1990'ların ortalarında) sorunuzun yanıtlanmasına yardımcı olabilir. Doktora tezi (kitap olarak mevcuttur) Guy E. Blelloch. Veri Paralel Hesaplama için Vektör Modelleri.MIT Press, 1990 bazı cevaplar verebilir. Baktığımdan beri bir süre önceydi.

Kuş-Meertens Biçimciliği (BMF) üzerinde yapılan çalışmalar, Sadaka dilinde olduğu gibi bu kategoriye girmektedir . Charity wikipedia sayfasından, dilin Turing tamamlanmadığını, ancak Ackermann'ın işlevini ifade edebileceğini söyler, bu da ilkel özyinelemeden daha fazlası anlamına gelir. Hem BMF hem de Charity, kıvrımlar ve taramalar (katamorfizmler, anamorfizmler, vb.) Operatörleri içerir ve kökleri Kategori Teorisinde bulunur.

Kısacası, kesin olmayan cevap, çok fazla ifade edebilmenizdir.


1
NESL tam bir dil değildir.
Per Vognsen

NESL'in bir süredir yüzeysel olarak farkındaydım, ancak Blelloch'un makalelerinden birini ilk kez ayrıntılı olarak okudum. Bahşiş için teşekkürler. NESL, Per Vognsen'in fark ettiği gibi, özyinelemeye izin vermesi dışında, yukarıda tanımladığım dile oldukça benziyor.
Alex Rubinsteyn

Ayrıca Blelloch'un ilkel operatörlerin seçimiyle de ilgileniyorum: harita, dist ('doldurmak' dediğimle aynı inanıyorum), uzunluk, dizi-okuma, dizi-yazma, tarama, bölme, düzleştirme. NESL'nin ilkel öğeleri "tamamlandı mı?" Ya da bunları kullanarak verimli bir şekilde ifade edilemeyen veri paralel uygulaması ile başka bir işlem var mı?
Alex Rubinsteyn

2
Özyinelemeyi kaldırın, özellikle de kıvrımlar ve benzeri düşünürseniz, oldukça etkileyici bir diliniz var. BMF'ye ve onu takip eden işe bakmak daha ilgi çekici olabilir. Üzgünüm, ama bu alanda güncel değilim.
Dave Clarke

7

Diğer cevabım dildeki kusurları işaret etti. Bu cevapta, kıvrımların ve katların birlikte ortaya çıkmasıyla ilgili konular hakkında daha fazla ayrıntı vereceğim. Daha sonra bir çözüm önereceğim ve P'deki (ve aslında daha birçok) tüm sorunların bu genişletilmiş dilde çözülebileceğini göstereceğim.

Toplam bir dilde katlama listeleri tüketir:

fold :: (a -> b -> b) -> b -> List a -> b

Toplam bir dilde açılma, potansiyel olarak sınırlandırılmamış akışlar oluşturur:

unfold :: (b -> Maybe (a, b)) -> b -> Stream a

Ne yazık ki, listeler ve akışlar farklı dünyalarda yaşıyor, bu nedenle bu operatörler oluşturulamıyor. Kısmi bir yazışmaya ihtiyacımız var:

stream :: List a -> Stream a
list :: Int -> Stream a -> List a

Akış operatörü bir listeyi sınırlı akışa gömer. List işlevi ilk n öğesini (veya akış daha önce sonlanırsa daha azını) bir listeye çıkarır. Dolayısıyla aşağıdaki denklemimiz var:

for all xs :: List a, xs == list (length xs) (stream xs)

Bir verimlilik optimizasyonu olarak, ara veri yapısı olarak akışları tamamen kesebiliriz:

unfoldList :: Int -> (b -> Maybe (a, b)) -> b -> List a

Şimdi bunun (orijinal soruda zaten ima edilen diğer operatörlerle) herhangi bir polinom-zaman algoritmasını simüle etmemize izin verdiğini gösteren bir kanıt çizeceğim.

Tanım olarak, bir Turing makinesi M ve bir polinom p olduğunda L dili P'dir, öyle ki L'deki x üyeliğine M, n = | x | 'da en fazla p (n) yinelemesinde M çalıştırılarak karar verilebilir. Standart bir argümanla, makinenin bandı sonsuz olsa bile, yineleme k'deki makine bandının durumu en fazla 2k + 1 uzunluk listesi ile kodlanabilir.

Fikir şimdi M'nin listelerden listelere geçişi bir işlev olarak göstermektir. Makinenin yürütülmesi, başlangıç ​​durumunun geçiş işleviyle açılmasıyla yapılacaktır. Bu bir liste akışı oluşturur. L'nin P'de olduğu varsayımı, akıma p (n) elementlerinden başka bir yere bakmamız gerekmediği anlamına gelir. Böylece list p(n)sonlu bir liste elde etmek için açılımı oluşturabiliriz . Son olarak, karar sorunun cevabının evet ya da hayır olup olmadığını kontrol etmek için üzerine katlanırız.

Daha genel olarak, bu, sonlandırma zamanı dilde hesaplanabilir bir fonksiyonla sınırlanabilen bir algoritmaya sahip olduğumuzda, onu simüle edebileceğimizi gösterir. Bu aynı zamanda Ackermann'ın işlevi gibi bir şeyin neden simüle edilemediğini de gösteriyor: bu onun kendi sınırı, bu yüzden tavuk ve yumurta problemi var.


4

Çok hileli bir dil. Faktöriyel fonksiyonu programlamayı deneyin:

fact 0 = 1
fact n = n * fact (n-1)

Sorun şu ki, dilinizde sadece kıvrımlar var ama açılmıyor. Faktöriyeli ifade etmenin doğal yolu, çarpan olarak onu yırtan katlama ile n [1, 2, ..., n] listesine bir açılım oluşturmaktır.

Bu özel dil veya genel olarak toplam fonksiyonel programlama ile gerçekten ilgileniyor musunuz? Dilinizin en fazla polinom-zaman algoritmalarını ifade edebileceği açıktır. Sistem F (polimorfik lambda hesabı) Ackermann'ın işlevi gibi canavarları kolaylıkla ifade edebilir. İlginiz polinom-zaman algoritmalarında olsa bile, onları doğal olarak ifade etmek için sıklıkla süper-polinom dirsek odasına ihtiyacınız vardır.

Düzenleme: Dave işaret ettiği gibi, NESL seminal fonksiyonel veri-paralel programlama dillerinden biridir ama toplamdan çok uzak (hatta denemiyor). APL ailesi paralel bir evrim izine sahipti ve toplam cebirsel altkümeye sahipti (sabit nokta operatörlerinden kaçın). Sorunuzun odak noktası bütünlükse, David Turner özellikle veri paralel programlamaya olmasa da bu alanda bazı iyi makaleler yazmıştır.


Maalesef, ortaya çıkan operatörlerin eksikliği benim açımdan bir gözetim ... Bir tane eklemek istedim ama postaya koymayı unuttum. Mutlaka bu özel dil ile ilgilenmiyorum, daha çok veri paralel hesaplamasının ifade ve sınırları.
Alex Rubinsteyn

Açılım, doğal olarak değerlidir, dizi değeri değil, toplam katı dillerde çekirdeklemeyle ilgili temel bir sorundur.
Vognsen Per
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.