Saya meminta maaf sebelumnya untuk format posting blog dari jawaban saya. Saya tidak bisa menahan diri untuk membuat ikhtisar kecil tentang dunia komputasi paralel.
Anda dapat mengategorikan model pemrograman paralel dalam kira-kira dua kategori: model kontrol aliran dan data aliran.
The model kontrol aliran mencoba untuk membuat pekerjaan paralelisme dalam konteks program eksplisit kontrol, pada dasarnya setiap komputer diprogram hari ini. Masalah mendasar yang dihadapi adalah bahwa 'arsitektur Von Neumann' seperti itu tidak dirancang untuk eksekusi paralel, tetapi perhitungan sekuensial yang efisien. Paralelisme dalam konteks tersebut diperoleh dengan menduplikasi bagian-bagian modul dasar (memori, kontrol, aritmatika).
Duplikasi hanya aritmatika memberi Anda instruksi SIMD, semua ALU berbagi Program Counter (PC) yang sama dan dengan demikian selalu menjalankan operasi yang sama secara paralel, meskipun pada data yang berbeda.
Menggandakan ALU dan PC tetapi menjaga sequencer instruksi di dalam unit kontrol memberi Anda eksekusi Out of Order (OoO) yang menghasilkan beberapa paralelisme pipa. Dalam kategori ini Anda juga memiliki teknik Instruksi Kata Sangat Panjang (VLWI) dan prediksi dedak. Anda jarang melihat kategori ini di tingkat perangkat lunak.
Melangkah lebih jauh adalah menduplikasi seluruh 'inti' tetapi menjaga memori tetap digunakan bersama, ini adalah prosesor multicore saat ini yang memberi Anda tugas (atau utas) paralelisme. Berbagi memori dalam konteks ini memberi Anda masalah konkurensi yang sangat, sangat keras, dan halus . Komputasi paralel pada multicore saat ini dengan demikian sepenuhnya berputar di sekitar masalah sinkronisasi / konkurensi, keseimbangan kinerja yang cermat (tanpa sinkronisasi) dan semantik yang diinginkan (sepenuhnya disinkronkan, semantik eksekusi berurutan). Contoh dari ini adalah PRAM atau lebih populer hari ini Cilk ofshoots seperti fork / join ( IntelTBB , Java.Utils.Concurrency). Model CSP dan Aktor adalah model konkurensi, tetapi seperti yang disebutkan di atas konkurensi dan paralelisme menjadi kabur dalam lingkungan memori bersama. nb paralelisme adalah untuk kinerja, konkurensi untuk mempertahankan semantik yang benar.
Memori duplikat juga memberi Anda komputer jaringan yang diprogram dengan MPI dan sejenisnya atau hanya arsitektur non-Von Neumann yang aneh seperti prosesor jaringan-on-a-chip (prosesor cloud, Transputer, Tilera). Model memori seperti UMA atau NUMA mencoba untuk mempertahankan ilusi memori bersama dan dapat ada pada tingkat perangkat lunak atau perangkat keras. MPI mempertahankan paralelisme tingkat program dan hanya berkomunikasi melalui pengiriman pesan. Pesan lewat juga digunakan pada tingkat perangkat keras untuk komunikasi dan konkurensi (Transputer).
Kategori kedua adalah model aliran data . Ini dirancang pada awal era komputer sebagai cara untuk menulis dan menjalankan komputasi paralel, menghindari desain Von Neumann. Ini telah keluar dari mode (untuk komputasi paralel) pada tahun 80-an setelah kinerja berurutan naik secara eksponensial. Namun, banyak sistem pemrograman paralel seperti Google MapReduce, Dryad Microsoft atau Collections Collections Intel sebenarnya adalah model komputasi aliran data. Pada titik tertentu mereka mewakili perhitungan sebagai grafik dan menggunakannya untuk memandu eksekusi.
Dengan menentukan bagian-bagian dari model Anda mendapatkan berbagai kategori dan semantik untuk model aliran data. Apa yang Anda batasi bentuk grafik untuk: DAG (CnC, Dryad), pohon (mapreduce), digraf? Apakah ada semantik sinkronisasi yang ketat ( Kilau, pemrograman reaktif]? Apakah Anda melarang rekursi untuk dapat memiliki jadwal statis (StreaMIT) atau apakah Anda memberikan kekuatan yang lebih ekspresif dengan memiliki penjadwal dinamis (Intel CnC)? Apakah ada batasan jumlah tepi yang masuk atau keluar? Apakah semantik firing memungkinkan menembakkan node ketika subset dari data yang masuk tersedia? Apakah tepi aliran data (pemrosesan aliran) atau token data tunggal (penugasan statis / dinamis tunggal). Untuk pekerjaan terkait Anda bisa mulai dengan melihat pekerjaan penelitian aliran data orang-orang seperti Arvind, K. Kavi, j. Sharp, W. Ackerman, R. Jagannathan, dll.
Sunting: Demi kelengkapan. Saya harus menunjukkan ada juga model paralel -driven dan model-driven . Untuk strategi reduksi, Anda memiliki pengurangan grafik dan pengurangan string secara luas. Haskell pada dasarnya menggunakan pengurangan grafik, yang merupakan strategi yang sangat efisien pada sistem shared-memory berurutan. Duplikat pengurangan-string berfungsi, tetapi memiliki properti memori-pribadi yang membuatnya lebih cocok untuk diparalelkan secara implisit. Model yang digerakkan oleh pola adalah bahasa logika paralel, seperti prolog bersamaan. Model Aktor juga merupakan model yang digerakkan oleh pola, tetapi dengan karakteristik memori pribadi.
PS. Saya menggunakan istilah 'model' secara luas, mencakup mesin-mesin abstrak untuk keperluan formal dan pemrograman.