นี่เป็นคำถามที่ดีเพราะการเข้าใจอัลกอริธึมเชิงตัวเลขและประสิทธิภาพเป็นข้อกำหนดเบื้องต้นที่สำคัญสำหรับการเป็นนักวิทยาศาสตร์การคำนวณที่มีประสิทธิภาพ ในขณะเดียวกันก็เป็นคำถามที่น่าสงสารเพราะข้อ จำกัด ที่วางไว้ไม่ได้มีคุณสมบัติเพียงพอที่จะให้คำตอบที่มีความหมาย
ประสิทธิภาพของการคำนวณทั้งสามจะขึ้นอยู่กับความแม่นยำที่จำเป็นในผลลัพธ์สุดท้ายรวมถึงความแม่นยำขั้นต่ำที่ต้องการเพื่อแสดงตัวถูกดำเนินการ คุณมีคุณสมบัติ , bและcเป็นตัวเลขจริงที่เป็นบวก แต่เราจำเป็นต้องทราบว่าต้องมีตัวเลขสองหลักd nเพื่อแสดงตัวเลขอย่างถูกต้อง เพื่อทำความเข้าใจข้อควรพิจารณาเกี่ยวกับประสิทธิภาพสำหรับหมายเลขจริงทั่วไปอันดับแรกเราต้องเข้าใจว่าคอมพิวเตอร์เป็นตัวแทนของจำนวนเต็มได้อย่างไรรวมถึงวิธีประมาณจำนวนจริงโดยใช้ตัวเลขทศนิยมaขคdn
เมื่อคอมพิวเตอร์ใช้งานบนเลขจำนวนเต็มจำนวนหลักเลขฐานสองที่จำเป็นต้องมีค่าเท่ากับบันทึก2ของขนาดของจำนวนเต็มบวกอีกเล็กน้อยสำหรับการจัดการสัญญาณ:M2
บันทึก 2 | M | + 1dn=2| M| +1
ตัวอย่างเช่นตัวเลข -8 สามารถแสดงด้วยเลขฐานสอง 4 หลัก สำหรับประสิทธิภาพและพื้นที่ - ประสิทธิภาพหน่วยคำนวณเชิงตรรกะ (ALUs) รับผิดชอบการคำนวณเชิงตัวเลขของจำนวนเต็มในหน่วยประมวลผลที่ทันสมัยได้รับการออกแบบมาเพื่อจัดการทางคณิตศาสตร์เกี่ยวกับจำนวนเต็มจนถึงขนาดคงที่บางวันที่พบบ่อยที่สุดคือ d = 32 และ d = 64 ไม่ใช่เพียงโปรเซสเซอร์ x86 เช่นเดียวกับในคอมพิวเตอร์ของคุณที่มี ALU แต่เป็นหน่วยการสร้างพื้นฐานของสถาปัตยกรรมคอมพิวเตอร์ที่แพร่หลายในสังคมอิเล็กทรอนิกส์ในปัจจุบัน หากคุณคุ้นเคยกับเครื่องเล่นวิดีโอเกมคุณอาจจำ Nintendo 64 ซึ่งเป็นระบบวิดีโอเกมที่ตั้งชื่อตามขนาด (เป็นบิต) หน่วยคำนวณเลขคณิตบนตัวประมวลผลของคอนโซลได้รับการออกแบบมาเพื่อจัดการ
การบวกการลบและการคูณจำนวนเต็มบนหน่วยทางคณิตศาสตร์เชิงตรรกะนั้นมีประสิทธิภาพมากและมักจะไม่ต้องการการคำนวณอีกหลายรอบ หน่วยงานมีประสิทธิภาพน้อยกว่าและหน่วยประมวลผลที่ทันสมัยสามารถต้องการได้มากถึงหลายสิบรอบ ประสิทธิภาพขึ้นอยู่กับทั้งสถาปัตยกรรมของหน่วยการประมวลผล (และการใช้งานที่สอดคล้องกันของหน่วยทางคณิตศาสตร์และความถี่) โปรดทราบว่าตัวประมวลผล 64 บิตสามารถดำเนินการทางคณิตศาสตร์กับตัวถูกดำเนินการ -bit ด้วยความเร็วเดียวกันสำหรับxที่ใดก็ได้ระหว่าง 1 ถึง 64xx
ในการคำนวณทั่วไปและโดยเฉพาะอย่างยิ่งในการคำนวณทางวิทยาศาสตร์คณิตศาสตร์จำนวนเต็มไม่ได้ใช้สำหรับการคำนวณจำนวนมากและจำเป็นต้องใช้การแทนตัวเลขอีกจำนวนหนึ่งการแทนแบบ 'floating-point' จำนวนจุดลอยตัวแสดงถึงการประนีประนอมระหว่างวิธีการทำงานของไมโครโปรเซสเซอร์ที่ทันสมัย (ซื้อข้อมูลในรูปแบบ bit hunks) และความต้องการในการคำนวณโดยแสดงตัวเลขบนตัวประมวลผลในสัญลักษณ์ทางวิทยาศาสตร์ที่ถูกตัดทอนโดยใช้ฐานคงที่b (ปกติb = 2หรือข= 10 ) และเป็นตัวแทนจำนวนจำนวนเต็มสองจำนวนเป็น mantissa (ซิกในวงการบางคน) sและเป็นสัญลักษณ์อี จำนวนที่กำหนดxnขb = 2b = 10sอีx ถูกแสดงโดยประมาณว่า:
x = s ∗ bอี
ฉันพูดโดยประมาณเพราะมันควรจะชัดเจนว่าแม้แต่การปันส่วนอย่างง่ายเช่นไม่สามารถแสดงได้อย่างแน่นอนว่าเป็นจำนวนจุดลอยตัวสำหรับฐานมาตรฐาน จำนวนหลักที่กำหนดให้กับซิกนิฟิแคนด์กำหนดความถูกต้องของตัวเลขซึ่งสัมพันธ์กับขนาดของมันเอง IEEE 754 มาตรฐานระบุจำนวนของกฎสำหรับวิธีการที่จำนวนจุดลอยตัวที่คาดว่าจะประพฤติตนรวมทั้งช่วงของซิกและ mantissa (และช่วงและความแม่นยำที่สอดคล้องกัน) สำหรับค่าที่สำคัญหลายประการของdnเพื่อให้การคำนวณตัวเลขที่มีการทำซ้ำภายใน ความอดทนบางอย่าง มีความละเอียดเล็กน้อยเกี่ยวกับวิธีการทำงานของเลขทศนิยมซึ่งฉันไม่สามารถหวังได้ในคำตอบนี้สำหรับการแนะนำที่ดีฉันขอแนะนำ"สิ่งที่นักวิทยาศาสตร์คอมพิวเตอร์ทุกคนควรรู้เกี่ยวกับเลขคณิตจุดลอยตัว"13dn.
ความพยายามทางปัญญาจำนวนมากในช่วง 50 ปีที่ผ่านมาได้รับการลงทุนเพื่อปรับปรุงความสามารถของตัวประมวลผลเพื่อคำนวณการดำเนินการทางคณิตศาสตร์อย่างมีประสิทธิภาพ บนโปรเซสเซอร์ที่ทันสมัยการคำนวณเหล่านี้ได้รับการจัดการโดยหนึ่งหรือมากกว่าหนึ่งหน่วยจุดลอยตัว (FPUs) ซึ่งเป็นรุ่นที่ซับซ้อนมากขึ้นของหน่วยคำนวณเชิงตรรกะที่ออกแบบมาเพื่อดำเนินการทางคณิตศาสตร์กับตัวเลขทศนิยมและมักจะออกแบบมาเพื่อจัดการทั้ง IEEE 754-32 ตัวเลขจุดลอยตัว (มักเรียกว่า 'เลขทศนิยม') และตัวเลขจุดลอยตัว 64 บิต (มักเรียกว่า 'คู่') ได้อย่างมีประสิทธิภาพ เช่นเดียวกับหน่วยคำนวณทางคณิตศาสตร์หน่วยจุดลอยตัวสามารถคำนวณการบวกการลบและการคูณในเวลาเพียงไม่กี่รอบในขณะที่การหารมักจะต้องการอีกเล็กน้อย
ในกรณีส่วนใหญ่ IEEE 754 64-bit floating-point 'doubles' นั้นเพียงพอสำหรับการคำนวณเชิงตัวเลขดังนั้นให้เราสมมติว่า , bและcแต่ละตัวแสดงเป็น 64- บิตคู่และคุณสนใจประสิทธิภาพของ การคำนวณสามรายการเป็นการดำเนินการสเกลาร์บนสถาปัตยกรรม Intel Nehalem โดยใช้ชุดคำสั่งทศนิยม x87 นั่นคือคุณไม่สนใจที่จะคำนวณการดำเนินการเหล่านี้ในรูปแบบ for for loop หรือช่วงของข้อมูลและคุณไม่ต้องการใช้ส่วนขยายเวกเตอร์ . ข้อมูลเวลาในการตอบสนองจะถูกรวบรวมจากตารางอ้างอิงการเรียนการสอนที่ยอดเยี่ยมของ Agner Fogสำหรับสถาปัตยกรรม Intel / AMDaขค
- aข
- เข้าสู่ระบบคaค
- ค1ข
1 การยกกำลังทั่วไปมักนำมาใช้กับข้อมูลเฉพาะตัวดังต่อไปนี้:
aข= βa⋅logβb
โดยที่คือ2หรือe (ในกรณีนี้ฉันใช้β = 2 ) สมมติว่าคุณยินดีทิ้งความถูกต้องในผลลัพธ์ (หน่วย x87 ทำการคำนวณด้วยความแม่นยำ 80 บิต แต่นี่ไม่เพียงพอสำหรับค่าบางช่วงสำหรับaและb ) การคำนวณนี้สามารถทำได้ด้วยคำสั่งฮาร์ดแวร์ FYL2X การคำนวณค่า t = ⋅ เข้าสู่ระบบ2ขและการเรียนการสอนฮาร์ดแวร์ F2XM1 (มีบางช่วยปรับ) เพื่อคำนวณ2ตัน สมมติว่า ~ 20 รอบสำหรับการปรับสเกล:β2อีβ= 2aขT = ⋅ บันทึก2ข2เสื้อ
FYL2X + F2XM1 + ~ 20 = 80 + 51 + ~ 20 = ~ 151 รอบ
2สิ่งนี้สามารถแปลงเป็นสองลอการิทึมและการหารโดยการเปลี่ยนแปลงของข้อมูลประจำตัวพื้นฐานและไม่จำเป็นต้อง rescaling สำหรับผลลัพธ์ที่ถูกต้อง
2 * FYL2X + FDIV = 2 * 80 + (7 ถึง 27) = 167 ถึง 187 รอบ
[3] นี่เทียบเท่ากับการหารตามด้วยการยกกำลังดังนั้น [1] บวก FDIV, ~ 175 รอบ