ความแม่นยำจุดเดียวเทียบกับสองเท่า


13

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

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

FPU สมัยใหม่ช่วยให้การแปลงจากความแม่นยำเดี่ยว (ลอย) เป็นความแม่นยำสองเท่า (สองเท่า) และในทางกลับกันได้หรือไม่? หรือการดำเนินการที่มีราคาแพงเหล่านี้?

คำตอบ:


7

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


ขอบคุณศาสตราจารย์ Bangerth แล้วตัวแก้เมทริกซ์วนซ้ำล่ะ? คุณเพิ่มความแม่นยำเป็นสองเท่าสำหรับผลิตภัณฑ์เมทริกซ์ - เวกเตอร์หรือปรับขนาดองค์ประกอบเวกเตอร์ลงเป็นหนึ่งเดียวสำหรับการคูณและสำรองเป็นสองเท่าสำหรับการสะสม?
Costis

แน่นอนว่าฉันกำลังพูดถึงนักแก้ปัญหาซ้ำแล้วซ้ำอีก เราทำเวกเตอร์ทั้งหมดด้วยความแม่นยำสองเท่า (เพราะมันไม่สำคัญ) ดังนั้นการดำเนินการ dst = matrix src จึงเกิดขึ้นเป็น double = float double การสะสมเกิดขึ้นในความแม่นยำสองเท่า แต่จริง ๆ แล้วฉันต้องประหลาดใจมากถ้ามันมีความสำคัญ
Wolfgang Bangerth

มีกระดาษออกมาจากที่นั่นสักแห่ง (จาก 2 ทศวรรษหลัง) แสดงว่าผลิตภัณฑ์ดอทควรทำด้วยความแม่นยำสูงกว่าสองเท่า ฉันไม่มีการอ้างอิงที่มีประโยชน์ แต่ฉันจะดูว่าฉันสามารถหาได้ในภายหลัง
Bill Barth

ใช่นั่นจะไม่ทำให้ฉันประหลาดใจ นั่นยังตรงกับสิ่งที่เราทำ
Wolfgang Bangerth

คุณใช้ความแม่นยำแบบสี่จุดสำหรับผลิตภัณฑ์จุดหรือไม่ ถ้าเป็นเช่นนั้นเจ๋ง! ฉันไม่ได้ยินว่ามีใครทำเช่นนี้ในห้องสมุด
Bill Barth

4

กระดาษที่ดีในหัวข้อนี้จะเร่งการคำนวณทางวิทยาศาสตร์ที่มีขั้นตอนวิธีการผสมที่มีความแม่นยำ


3

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

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

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

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