ซีพียูที่ออกแบบมาเพื่อการเขียนโปรแกรมฟังก์ชั่นจะแตกต่างกันอย่างไร


14

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

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

ถ้าใครจะออกแบบ CPU จากศูนย์รู้ว่ามันจะใช้งานโปรแกรมที่เขียนในรูปแบบการเขียนโปรแกรมที่ใช้งานได้เท่านั้น CPU นั้นจะออกแบบให้แตกต่างจาก CPU ที่มีอยู่ได้อย่างไร


9
John Backus ใน "การเขียนโปรแกรมสามารถปลดปล่อยจาก von Neumann Style" กล่าวถึงงานดังกล่าวเพียงเล็กน้อย (มาตรา 15)
Dmitri Urbanowicz

มองหาเครื่องลดขนาด (กราฟ) หรือเยี่ยมชมห้องสมุดการวิจัยในพื้นที่ของคุณโดยหวังที่จะค้นหาสำเนาของหนังสือที่พิมพ์ออกมาของ W. Kluge องค์กรการลดการไหลของข้อมูลและระบบควบคุมการไหล (MIT Press, 1992)
ไก่

2
นอกจากนี้หนังสือของ Koopman สถาปัตยกรรมสำหรับการลดกราฟ Combinator (AP, 1990) การมองหาเครื่องเสียงกระเพื่อมก็น่าจะคุ้มค่าเช่นกัน en.wikipedia.org/wiki/Lisp_machine
นามแฝง

ฉันคิดว่าพื้นฐานเครื่องของเราจะมีความจำเป็นเสมอเมื่อพวกเขาดำเนินการเมื่อเวลาผ่านไปกลายพันธุ์รัฐ
orlp

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

คำตอบ:


3

ที่จริงแล้วเสร็จแล้ว: https://en.wikipedia.org/wiki/Lisp_machine

ด้านหนึ่งในการออกแบบ CPU สำหรับ FP คือการรวบรวมขยะ GC เป็นสิ่งสำคัญมากสำหรับภาษาที่ใช้งานได้ การใช้งานทั่วไปต้องการให้ GC สามารถแยกแยะระหว่างข้อมูลพอยน์เตอร์และข้อมูลที่ไม่ใช่ตัวชี้ อย่างมีประสิทธิภาพนั่นหมายถึงการจัดเก็บข้อมูลเพิ่มเติมเล็กน้อยในข้อมูลของคุณ นี่คือเหตุผลที่ตัวอย่างเช่นจำนวนเต็ม OCaml เป็นเพียง 31 บิตบนสถาปัตยกรรม 32 บิตและ 63 บิตในสถาปัตยกรรม 64 บิต เลขคณิตจำนวนเต็มจากนั้นเกี่ยวข้องกับการดำเนินการขยับพิเศษที่น่าอึดอัดใจ ภาษาอื่น ๆ (หรือประเภทข้อมูล OCaml อื่น ๆ ) อาจเสียคำทั้งเครื่องสำหรับบิตพิเศษนั้นดังนั้นการใช้ 128 บิตสำหรับจำนวนเต็ม 64 บิต ซีพียูที่ได้รับการออกแบบตามธรรมชาติต่อ GC อาจมีบัสข้อมูล 65 บิต แต่เป็นเลขคณิต 64 บิต

ที่กล่าวว่าภาษาที่ไม่สามารถใช้งานได้จำนวนมากก็มีการเก็บขยะและจะได้รับประโยชน์จากสถาปัตยกรรมที่เกี่ยวข้อง

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


1

มันจะไม่เปลี่ยนอะไรเลยหรือจะควบคุมการตั้งค่าแบบขนานขนาดใหญ่อย่างเช่นในReduceronและผู้สืบทอดของPilGRIM 1ด้วยกองซ้อนขนาดใหญ่

คำแถลงว่าจะไม่มีอะไรเปลี่ยนแปลงในตอนแรก แต่เนื่องจาก CPU เป็นแบบต่อเนื่องจึงมีกระบวนการแปล (การคอมไพล์) ที่ใช้ฮาร์ดแวร์ที่มีอยู่เพื่อเพิ่มประสิทธิภาพ จะต้องมีสถาปัตยกรรมอื่นการดำเนินการบางอย่างจะเร็วขึ้นบางคนต้องใช้เทคนิคการแฮ็กเพื่อเร่งความเร็ว

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

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

การเพิ่มคำตอบของ kne นั้น GC จะเป็นประโยชน์ต่อการทำงานเป็นตัวประมวลผลร่วมมันจะเป็นคุณสมบัติที่เรียบร้อยมาก

1: PilGRIM อธิบายไว้อย่างถูกต้องในBoeijink A. , Hölzenspies PKF, Kuper J. (2011) แนะนำผู้แสวงบุญ: ตัวประมวลผลสำหรับปฏิบัติการ Lazy Function ภาษา ใน: Hage J. , Morazán MT (eds) การนำไปปฏิบัติและการประยุกต์ใช้ภาษาเชิงหน้าที่ IFL 2010 บรรยายในสาขาวิทยาศาสตร์คอมพิวเตอร์ฉบับ 6647. สปริงเกอร์, เบอร์ลิน, ไฮเดลเบิร์ก


"ไม่มีความเป็นไปได้ที่จะทำให้เกิดการสอบถามซ้ำ" คุณช่วยอธิบายได้ไหมว่าเพราะอะไร ตอนแรกฉันรู้สึกประหลาดใจมาก
user56834

นอกจากนี้ยังเป็นสิ่งที่ลดที่อาจเป็นซีพียูยากแทนการทำงานบน fpga?
user56834

ไม่ดีของฉันฉันหมายถึงการเรียกซ้ำพื้นเมืองแต่มันเป็นเรื่องที่ไม่เกี่ยวข้อง ฉันต้องแก้ไขอีกหน่อย
Evil

0

เรื่องตลกเล็กน้อยแรก: เนื่องจากการใช้งานโปรแกรมที่ใช้งานได้ 100% ไม่สามารถทำสิ่งใดที่มีประโยชน์ได้ (ฉันเปิดสิ่งนี้เพื่อดูเปลวไฟสงคราม)

ดังนั้นจะต้องมีคำสั่งที่จำเป็นสำหรับ IO และการสนับสนุนปกติสำหรับการเขียนโปรแกรมที่จำเป็น

มิฉะนั้นจะขึ้นอยู่กับภาษาที่ใช้จริงบางส่วน สองสิ่งที่อยู่ในใจของฉันคือ Haskell และ Erlang

ฉันเชื่อว่า Haskell จะได้รับประโยชน์จากการสนับสนุนรายการและแผนที่ รายการสามารถได้รับการสนับสนุนโดยการแมปหน่วยความจำฮาร์ดแวร์ที่เฉพาะเจาะจงเปลี่ยนรายการที่เชื่อมโยงเป็นชุดที่อยู่ติดกัน องค์ประกอบแรกอาจเป็นที่อยู่ n และที่สองคือที่อยู่ n + 1 เป็นต้น ในการลบองค์ประกอบแรกออกจากรายการคุณเพียงแค่เปลี่ยนตัวชี้ n ในที่สุดเมื่อคุณลบตัวชี้ n หน่วยความจำทั้งหมดอาจเป็นอิสระ สามารถรองรับแผนที่เป็นอาร์เรย์เชื่อมโยง - ป้อนค่าการค้นหาและระบบหน่วยความจำส่งคืนรายการ ไม่จำเป็นต้องทำการค้นหาซ้ำ

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

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