ฉันต้องขออภัยล่วงหน้าสำหรับรูปแบบการโพสต์บล็อกของคำตอบของฉัน ฉันอดไม่ได้ที่จะสร้างภาพรวมขนาดเล็กของโลกแห่งการคำนวณแบบขนาน
คุณสามารถจัดหมวดหมู่โมเดลการโปรแกรมมิงแบบขนานได้ในสองประเภทโดยประมาณ: โมเดลโฟลว์ควบคุมและข้อมูลไหล
รุ่นควบคุมการไหลพยายามที่จะทำให้การทำงานของความเท่าเทียมในบริบทของโครงการอย่างชัดเจนควบคุมโดยทั่วไปคอมพิวเตอร์โปรแกรมได้ทุกวัน ปัญหาพื้นฐานที่ถูกแก้ไขคือ 'สถาปัตยกรรม Von Neumann' ไม่ได้ถูกออกแบบมาสำหรับการประมวลผลแบบขนาน แต่เป็นการคำนวณตามลำดับที่มีประสิทธิภาพ ความเท่าเทียมในบริบทดังกล่าวนั้นได้มาจากการทำส่วนต่าง ๆ ของโมดูลพื้นฐาน (หน่วยความจำการควบคุมเลขคณิต)
การทำซ้ำเลขคณิตเพียงอย่างเดียวจะให้คำสั่ง SIMD ให้คุณ ALU ทั้งหมดแบ่งปัน Program Counter (PC) เดียวกันและทำให้การดำเนินการเดียวกันเสมอในแบบคู่ขนานแม้ว่าจะมีข้อมูลต่างกัน
การทำสำเนา ALU และพีซี แต่การรักษาซีเควนเซอร์คำสั่งภายในหน่วยควบคุมจะทำให้การดำเนินการตามคำสั่งซื้อ (OoO) ของคุณเป็นไปอย่างราบรื่น ในหมวดหมู่นี้คุณยังมีเทคนิคการเรียนการสอนคำศัพท์ที่ยาวมาก (VLWI) และการคาดคะเนสาขา คุณไม่ค่อยเห็นหมวดหมู่นี้ในระดับซอฟต์แวร์
การทำต่อไปอีกเล็กน้อยเป็นการทำซ้ำ 'คอร์' ทั้งหมด แต่ทำให้การแชร์หน่วยความจำร่วมกันเป็นตัวประมวลผลแบบมัลติคอร์ปัจจุบันที่ให้งานของคุณ (หรือเธรด) แบบขนาน หน่วยความจำที่ใช้ร่วมกันในบริบทนี้จะช่วยให้คุณมากยากมากและปัญหาที่ลึกซึ้งเห็นพ้องด้วย การคำนวณแบบขนานบนมัลติคอร์ปัจจุบันจึงหมุนรอบปัญหาการซิงโครไนซ์ / การเกิดพร้อมกันอย่างสมบูรณ์สมดุลของประสิทธิภาพ (ไม่ซิงค์) และซีแมนทิคส์ที่ต้องการ (ซิงโครไนซ์ทั้งหมด ตัวอย่างของสิ่งนี้คือเรือท้องแบนหรือที่นิยมมากขึ้นในทุกวันนี้ที่Cilk ofshoots เช่น fork / join ( IntelTBB , Java.Utils.Concurrency) โมเดล CSP และ Actor เป็นโมเดลที่ทำงานพร้อมกัน แต่ดังที่ได้กล่าวมาแล้วข้างต้นการทำงานพร้อมกันและการขนานจะเบลอในสภาพแวดล้อมของหน่วยความจำที่ใช้ร่วมกัน nbismism สำหรับประสิทธิภาพการทำงานพร้อมกันเพื่อรักษาความหมายที่ถูกต้อง
หน่วยความจำที่ซ้ำซ้อนก็ให้ทั้งคอมพิวเตอร์ในเครือข่ายที่ตั้งโปรแกรมด้วย MPI และตระกูลหรือสถาปัตยกรรมแปลก ๆ ที่ไม่ใช่ของ Von Neumann เช่นโปรเซสเซอร์บนเครือข่ายบนชิป (คลาวด์โปรเซสเซอร์ Transputer, Tilera) รุ่นหน่วยความจำเช่นUMAหรือNUMAพยายามรักษาภาพลวงตาของหน่วยความจำที่ใช้ร่วมกันและสามารถมีอยู่ในซอฟต์แวร์หรือระดับฮาร์ดแวร์ MPI รักษาความขนานของระดับโปรแกรมและสื่อสารผ่านการส่งผ่านข้อความเท่านั้น การส่งข้อความยังใช้กับระดับฮาร์ดแวร์สำหรับการสื่อสารและการทำงานพร้อมกัน (Transputer)
ประเภทที่สองเป็นรูปแบบข้อมูลไหล สิ่งเหล่านี้ได้รับการออกแบบในตอนเช้าของยุคคอมพิวเตอร์เพื่อเขียนและดำเนินการคำนวณแบบขนานโดยหลีกเลี่ยงการออกแบบของฟอนนอยมันน์ สิ่งเหล่านี้หลุดพ้นจากความนิยม (สำหรับการประมวลผลแบบขนาน) ในยุค 80 หลังจากประสิทธิภาพตามลำดับเพิ่มขึ้นแบบทวีคูณ อย่างไรก็ตามระบบการเขียนโปรแกรมแบบขนานจำนวนมากเช่น Google MapReduce, Dryad ของ Microsoft หรือ Concurrent Collections ของ Intel นั้นอยู่ในรูปแบบการคำนวณดาต้าโฟลว์ ณ จุดหนึ่งพวกเขาแสดงการคำนวณเป็นกราฟและใช้เพื่อเป็นแนวทางในการปฏิบัติ
โดยการระบุบางส่วนของโมเดลคุณจะได้รับหมวดหมู่และซีแมนทิกส์ที่แตกต่างกันสำหรับโมเดลดาต้าโฟลว์ คุณ จำกัด รูปร่างของกราฟไว้ที่: DAG (CnC, Dryad), tree (mapreduce), digraph? มีความหมายการประสานที่เข้มงวด ( ความมันวาวการเขียนโปรแกรมแบบตอบโต้]? คุณไม่อนุญาตให้เรียกซ้ำเพื่อให้สามารถกำหนดตารางเวลาแบบสแตติก (StreaMIT) หรือคุณให้พลังการแสดงออกที่มากกว่าโดยมีตัวกำหนดตารางเวลาแบบไดนามิก (Intel CnC) หรือไม่ มีการ จำกัด จำนวนขอบขาเข้าหรือขาออกหรือไม่? ซีแมนทิกส์ firing อนุญาตให้ทำการโหนดได้หรือไม่เมื่อเซ็ตย่อยของข้อมูลที่เข้ามามีอยู่? ขอบกระแสข้อมูล (การประมวลผลสตรีม) หรือโทเค็นข้อมูลเดี่ยว (การกำหนดค่าคงที่ / ไดนามิกเดี่ยว) สำหรับงานที่เกี่ยวข้องคุณสามารถเริ่มต้นโดยดูที่งานวิจัยดาต้าโฟลว์ของผู้คนเช่น Arvind, K. Kavi, j. คมชัด, W. Ackerman, R. Jagannathan, เป็นต้น
แก้ไข: เพื่อความสมบูรณ์ ฉันควรชี้ให้เห็นว่ายังมีโมเดลที่ใช้ตัวลดแบบขนานและแบบตัวขับเคลื่อน สำหรับกลยุทธ์การลดลงคุณมีการลดกราฟและการลดสตริง โดยทั่วไป Haskell ใช้การลดกราฟซึ่งเป็นกลยุทธ์ที่มีประสิทธิภาพมากในระบบหน่วยความจำที่แชร์ต่อเนื่อง การลดสตริงซ้ำจะทำงานได้ แต่มีคุณสมบัติหน่วยความจำส่วนตัวที่ทำให้มันเหมาะกว่าที่จะขนานกันโดยปริยาย รูปแบบที่ขับเคลื่อนด้วยรูปแบบเป็นภาษาลอจิกแบบขนานเช่นการเปิดฉากพร้อมกัน โมเดลนักแสดงยังเป็นโมเดลที่ขับเคลื่อนด้วยรูปแบบ แต่มีคุณสมบัติหน่วยความจำส่วนตัว
PS ฉันใช้คำว่า 'model' แบบกว้าง ๆ ซึ่งครอบคลุมถึงเครื่องนามธรรมสำหรับวัตถุประสงค์ทั้งทางการและโปรแกรม