คำถามติดแท็ก fast-math

12
ทำไม GCC จึงไม่ปรับ a * a * a * a * a ถึง (a * a * a) * (a * a * a)?
ฉันกำลังทำการเพิ่มประสิทธิภาพเชิงตัวเลขในแอปพลิเคชันทางวิทยาศาสตร์ สิ่งหนึ่งที่ฉันสังเกตเห็นคือ GCC จะเพิ่มประสิทธิภาพการโทรpow(a,2)โดยรวบรวมมันเข้าไปa*aแต่การโทรpow(a,6)นั้นไม่ได้รับการปรับปรุงและจะเรียกฟังก์ชั่นห้องสมุดpowซึ่งทำให้ประสิทธิภาพช้าลงอย่างมาก (ตรงกันข้ามIntel C ++ Compiler ที่สามารถเรียกทำงานiccได้จะกำจัดการเรียกใช้ไลบรารีpow(a,6)) สิ่งที่ฉันอยากรู้คือเมื่อฉันแทนที่pow(a,6)ด้วยการa*a*a*a*a*aใช้ GCC 4.5.1 และตัวเลือก " -O3 -lm -funroll-loops -msse4" จะใช้ 5 mulsdคำสั่ง: movapd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 ในขณะที่ถ้าฉันเขียน(a*a*a)*(a*a*a)มันจะผลิต movapd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd %xmm14, %xmm13 mulsd …

2
คณิตศาสตร์ที่รวดเร็วของ gcc ทำอะไรได้จริง?
ฉันเข้าใจว่าการ--ffast-mathตั้งค่าสถานะของ gcc สามารถเพิ่มความเร็วได้อย่างมากสำหรับ ops แบบลอยตัวและออกไปนอกมาตรฐาน IEEE แต่ฉันไม่สามารถหาข้อมูลเกี่ยวกับสิ่งที่เกิดขึ้นจริงได้เมื่อเปิดใช้งาน ใครช่วยกรุณาอธิบายรายละเอียดบางอย่างและอาจให้ตัวอย่างที่ชัดเจนว่าจะมีการเปลี่ยนแปลงอย่างไรถ้าธงเปิดหรือปิด? ฉันพยายามขุดผ่าน SO สำหรับคำถามที่คล้ายกัน แต่ไม่สามารถหาอะไรอธิบายการทำงานของคณิตศาสตร์ได้อย่างรวดเร็ว
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.