ทำไมการขนานและการเกิดพร้อมกันโดยนัยไม่แพร่หลายมากขึ้น? [ปิด]


13

ความเท่าเทียมโดยนัยโดยนัย ^สามารถนำภาระใหญ่ออกไปจากโปรแกรมเมอร์จำนวนมากวางไว้บนคอมพิวเตอร์ ดังนั้น ... ทำไมมันถึงไม่แพร่หลายในปัจจุบัน?


^ ขนานโดยปริยายคือการทำให้คอมพิวเตอร์สามารถคิดออกเองว่าจะทำอะไรมากกว่าหนึ่งอย่างในเวลาแทนที่จะเป็นโปรแกรมเมอร์ที่ต้องการทำงานนี้โดยใช้กระทู้และชอบ


ตรวจสอบ parasail การเขียนโปรแกรมภาษาที่พวกเขาดูเหมือนจะเป็นคนเดียวที่พยายามขนานนัยforge.open-do.org/plugins/moinmoin/parasail

คำตอบ:


11

เนื่องจากมีข้อยกเว้นเล็กน้อย (Haskell) จึงไม่มีวิธีที่คอมไพเลอร์สามารถแกะลูปได้ ปัญหาคือว่าการวนซ้ำแต่ละครั้งผ่านการวนซ้ำสามารถแก้ไขสถานะโกลบอล ดังนั้นการทำตามลำดับที่แตกต่างกันอาจทำให้สิ่งต่าง ๆ แตกหัก ใน Haskell คุณสามารถพึ่งพาฟังก์ชั่นที่บริสุทธิ์ซึ่งก็คือว่ามันไม่ได้อ่านหรือเปลี่ยนสถานะโลกดังนั้นพวกเขาสามารถดำเนินการในลำดับใด ๆ

ปัญหาที่แท้จริงคือมีข้อยกเว้นเล็กน้อยว่าจะทำอย่างไรดีพร้อมกันยังคงเป็นปัญหาเปิด ชุมชน Erlang และ Haskell ดูเหมือนจะทำได้ค่อนข้างดี แต่มันก็ยังคงเป็นทางยาวไปก่อนที่เราจะเข้าใจวิธีการเขียนโปรแกรมระบบ N-core สำหรับ N ขนาดใหญ่


1
ใน Scheme มีลูปบางอย่างที่เลือกไม่รับประกันการสั่งซื้อ
Javier

เยี่ยมฉันไม่ทราบว่าเกี่ยวกับโครงการ
Zachary K

5

ภาษาการเขียนโปรแกรมส่วนใหญ่ที่เราใช้อยู่ในขณะนี้ในเวลาที่การเขียนโปรแกรมแบบเธรดเดี่ยวและการโต้ตอบกับผู้ใช้คนเดียวที่ใช้กันมากที่สุดสำหรับหลาย ๆ แอปพลิเคชัน (เช่นแอปพลิเคชันเดสก์ทอปแบบสแตนด์อโลน) ด้วยการยกระดับการใช้งานเว็บแอพพลิเคชั่นคลาวด์คอมพิวติ้งและแอพพลิเคชั่นผู้ใช้หลายคนตอนนี้เราต้องการแอพพลิเคชั่นแบบมัลติเธรดที่มากขึ้น

ภาษาการเขียนโปรแกรมดั้งเดิมพยายามที่จะสนับสนุนฟีเจอร์มัลติเธรดจากภาษาเองอย่างช้าๆ (เช่น java ที่เพิ่ม java.util.concurrent)

ภาษาใหม่ที่จะเกิดขึ้นในอนาคตจะมีการสนับสนุนเธรดและการทำงานพร้อมกันที่ดีขึ้น


4

นอกเหนือจากประเด็นที่กล่าวถึงในคำตอบอื่น ๆ (ยากที่จะพิสูจน์ว่าการดำเนินงานมีความเป็นอิสระและโปรแกรมเมอร์คิดว่าลำดับ) มีปัจจัยที่สามที่ต้องพิจารณา: ค่าใช้จ่ายของการขนาน

ความจริงก็คือการขนานของเธรดนั้นมีค่าใช้จ่ายที่สำคัญมาก

  • การสร้างเธรดมีราคาแพงมาก : สำหรับเคอร์เนลการเริ่มเธรดจะเหมือนกับการเริ่มต้นกระบวนการ ฉันไม่แน่ใจเกี่ยวกับค่าใช้จ่ายที่แม่นยำ แต่ฉันเชื่อว่ามันอยู่ในคำสั่งของสิบไมโครวินาที

  • การสื่อสารด้วยเธรดผ่าน mutexes นั้นมีราคาแพง: โดยปกติสิ่งนี้ต้องมีการเรียกใช้ระบบในแต่ละด้านซึ่งอาจทำให้เธรดเข้าสู่โหมดสลีปและปลุกอีกครั้งซึ่งทำให้เกิดความหน่วงแฝงเช่นเดียวกับแคชเย็นและ TLB ที่ล้าง โดยเฉลี่ยการรับและปล่อยค่า mutex ประมาณหนึ่ง microsecond

จนถึงตอนนี้ดีมาก เหตุใดจึงเป็นปัญหาสำหรับการขนานโดยนัย? เพราะการขนานโดยปริยายนั้นง่ายที่สุดที่จะพิสูจน์ในสเกลเล็ก ๆ มันเป็นสิ่งหนึ่งที่จะพิสูจน์ได้ว่าการวนซ้ำสองครั้งของลูปแบบง่าย ๆ นั้นเป็นอิสระจากกันมันเป็นสิ่งที่แตกต่างกันอย่างสิ้นเชิงในการพิสูจน์ว่าการพิมพ์บางสิ่งไปยังstdoutและการส่งเคียวรีไปยังฐานข้อมูลนั้นเป็นอิสระต่อกัน กระบวนการฐานข้อมูลอาจอยู่อีกด้านหนึ่งของไปป์!)

นั่นคือการขนานโดยนัยที่โปรแกรมคอมพิวเตอร์สามารถพิสูจน์ได้ว่าไม่สามารถใช้ประโยชน์ได้เนื่องจากค่าใช้จ่ายในการขนานนั้นมากกว่าข้อดีของการประมวลผลแบบขนาน ในทางตรงกันข้ามการขนานขนาดใหญ่ที่สามารถเร่งความเร็วแอปพลิเคชันไม่สามารถพิสูจน์ได้สำหรับคอมไพเลอร์ แค่คิดว่าซีพียูทำงานได้มากแค่ไหนในหนึ่งวินาที ทีนี้ถ้าขนานกันควรจะเร็วกว่าโปรแกรมอนุกรมโปรแกรมขนานจะต้องสามารถทำให้ซีพียูทั้งหมดไม่ว่างเป็นเวลาหลายไมโครวินาทีระหว่างการเรียก mutex สองครั้ง ที่ต้องใช้การขนานที่มีเนื้อหยาบอย่างแท้จริงซึ่งแทบเป็นไปไม่ได้ที่จะพิสูจน์โดยอัตโนมัติ

ในที่สุดก็ไม่มีกฎโดยไม่มีข้อยกเว้น: การเอารัดเอาเปรียบของความเท่าเทียมโดยปริยายทำงานที่ไม่เกี่ยวข้องกับกระทู้ซึ่งเป็นกรณีที่มี vectorization ของรหัส (ใช้ชุดคำสั่ง SIMD เช่น AVX, Altivec ฯลฯ ) ที่ได้ผลดีที่สุดสำหรับการขนานขนาดเล็กที่ค่อนข้างง่ายต่อการพิสูจน์


0

โปรแกรมเมอร์คิดว่าเป็นลำดับและภาษาปัจจุบันถูกสร้างขึ้นเพื่อสนับสนุนโมเดลนั้น ด้วยข้อยกเว้นของภาษาเช่น Haskell Erlang ฯลฯ ภาษา (ฉันละเว้นจากการใช้คำคุณศัพท์ "ทันสมัย") เป็นส่วนประกอบระดับสูงเป็นหลักที่เรายังคงบอกคอมพิวเตอร์ว่าจะทำอย่างไรเมื่อต้องทำและวิธีการทำ จนกว่าเราจะมีระบบเสียงก้องที่เราบอกคอมพิวเตอร์ว่าผลลัพธ์ที่เราต้องการนั้นเป็นสิ่งที่มีให้เราไม่ได้มีความสามารถทางจิตในฐานะโปรแกรมเมอร์เพื่อใช้ประโยชน์สูงสุดจากการทำงานแบบมัลติเธรด

เช่นมันไม่เป็นธรรมชาติ ......


โปรแกรมเมอร์คิดว่าพวกเขาได้รับการสอนให้คิดอย่างไรเช่นเดียวกับที่พวกเขาเขียนโปรแกรมในลักษณะที่ภาษาโปรแกรมของพวกเขาส่งเสริมให้พวกเขาเขียนโปรแกรม ถ้าเป็นโปรแกรมเมอร์ที่ไม่เปิดเผยตัวเองเพื่อสิ่งที่เรียกว่าคุณขอบภาษาพวกเขาจะไม่ได้เรียนรู้ว่ามีวิธีการอื่น ๆ ของการให้เหตุผลเกี่ยวกับปัญหา ฉันคิดว่านี่เป็นเหตุผลว่าทำไมเจ็ดภาษาในเจ็ดสัปดาห์จึงสูงในรายการที่คนแนะนำจำนวนมาก
Mark Booth

Perhap fringe เป็นคำที่ผิด - ฉันหมายถึงภาษาที่ไม่ได้ใช้กันอย่างแพร่หลายในแอปพลิเคชันเชิงพาณิชย์ (เช่นไม่ใช่ C ++ หรือ Java)
mattnz

1
อย่างไรก็ตามฉันยืนตามคำยืนยันของฉัน (ไม่มีอะไร แต่ความเห็นของฉันเองที่จะสนับสนุนมัน) โปรแกรมเมอร์ที่เป็นคนไม่ได้มี cpacaity โลหะจริง ๆ "รับ" multithreading และ parrallisum ใหญ่ ไม่ใช่ธรรมชาติของมนุษย์ที่จะทำงานมากกว่าหนึ่งอย่างในเวลาเดียวกัน หนังสือเกี่ยวกับการจัดการเวลาที่จำเป็นทุกอย่างจะช่วยส่งเสริมแนวคิดในการเริ่มต้นทำบางสิ่งให้เสร็จแล้วจึงทำสิ่งต่อไป ในการใช้กระบวนทัศน์เหล่านี้อย่างมีประสิทธิภาพและประสิทธิผลเราต้องการการสนับสนุนเครื่องมือจำนวนมากซึ่งปัจจุบันยังไม่สามารถใช้ได้ มีน้อยคนที่ "รับ" มันและต้องพัฒนาเครื่องมือเหล่านี้
mattnz

1
ฉันคิดว่าdon't have the patienceเป็นการประเมินที่แม่นยำกว่าdon't have the mental capacityนี้ ในอาชีพของฉันฉันได้เห็นโปรแกรมเมอร์ที่ขี้เกียจมากกว่าที่ฉันเคยเห็นคนที่โง่ ฉันโชคดีที่ฉันได้รับการสอนการเขียนโปรแกรมการทำงานและการเขียนโปรแกรมแบบขนานอย่างละเอียดตามขั้นตอนด้านข้างและ OO ในปีแรกของฉันที่มหาวิทยาลัย ฉันสงสัยว่าโปรแกรมเมอร์หลายคนไม่โชคดีและกระบวนการคิดของพวกเขาได้รับผลกระทบโดยตรง
Mark Booth

0

การทำธุรกรรมจะต้องเป็นกรดดังนั้นโปรแกรมเมอร์ส่วนใหญ่มีแนวโน้มที่จะคิดเกี่ยวกับหนึ่งหัวข้อ

ภาษาและแพลตฟอร์มต้องปกป้องโปรแกรมเมอร์จากการเกิดพร้อมกันให้มากที่สุดเท่าที่จะทำได้

และการเกิดขึ้นพร้อมกันนั้นไม่ใช่เรื่องง่ายที่จะทดสอบเหมือนกับความเป็นตัวเองดังนั้นโปรแกรมเมอร์จึงมักจะออกไปจากประเด็นเหล่านี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.