ดูเหมือนว่าคุณต้องการวิธีที่จะประเมินว่า FPU ผูกมัดโค้ดของคุณอย่างไรหรือคุณใช้งาน FPU ได้อย่างมีประสิทธิภาพแค่ไหนแทนที่จะนับจำนวนฟล็อปตามคำจำกัดความที่เหมือนกันของ "ฟล็อบ" กล่าวอีกนัยหนึ่งคุณต้องการตัวชี้วัดที่ถึงจุดสูงสุดเดียวกันหากหน่วยจุดลอยตัวทุกหน่วยทำงานเต็มประสิทธิภาพทุกรอบ ลองดูที่ Intel Sandy Bridge เพื่อดูว่ามันจะสะบัดออกไปอย่างไร
การดำเนินการจุดลอยตัวที่สนับสนุนฮาร์ดแวร์
ชิปนี้รองรับคำแนะนำAVXดังนั้นการลงทะเบียนมีความยาว 32 ไบต์ (ถือ 4 คู่) สถาปัตยกรรม superscalar ช่วยให้คำแนะนำในการทับซ้อนกับคำสั่งทางคณิตศาสตร์ส่วนใหญ่ใช้เวลาไม่กี่รอบให้เสร็จสมบูรณ์แม้ว่าคำสั่งใหม่อาจจะสามารถเริ่มในรอบถัดไป ความหมายเหล่านี้มักจะมีตัวย่อโดยการเขียน latency / inverse throughput ค่า 5/2 จะหมายถึงว่าคำสั่งใช้เวลา 5 รอบเพื่อให้เสร็จสมบูรณ์ แต่คุณสามารถเริ่มต้นคำสั่งใหม่ทุกรอบอื่น ๆ (สมมติว่าตัวถูกดำเนินการมีอยู่แล้วดังนั้นจึงไม่มีข้อมูล พึ่งพาและไม่รอหน่วยความจำ)
มีหน่วยคำนวณเลขทศนิยมสามหน่วยต่อหนึ่งคอร์ แต่หน่วยที่สามไม่เกี่ยวข้องกับการสนทนาของเราเราจะเรียกหน่วย A และ M ที่เกี่ยวข้องสองอันเนื่องจากฟังก์ชันหลักคือการเพิ่มและการคูณ ตัวอย่างคำแนะนำ (ดูตารางของ Agner Fog )
vaddpd
: บรรจุเพิ่มแล้วครอบครองยูนิต A สำหรับ 1 รอบความเร็วในการตอบสนอง / ผกผันคือ 3/1
vmulpd
: การคูณที่บรรจุแล้ว, ยูนิต M, 5/1
vmaxpd
: เลือกขนาดสูงสุดที่เลือกไว้, หน่วย A, 3/1
vdivpd
: แบ่งการบรรจุหน่วย M (และ A), 21/20 ถึง 45/44 ขึ้นอยู่กับอินพุต
vsqrtpd
: รากที่สองที่อัดแน่น A และ M บางตัว 21/21 ถึง 43/43 ขึ้นอยู่กับอินพุต
vrsqrtps
: บรรจุสแควร์รูตแบบ reciprocal ที่มีความแม่นยำต่ำสำหรับอินพุตที่มีความแม่นยำเดียว (8 floats
)
ความหมายที่แม่นยำสำหรับสิ่งที่สามารถทับซ้อนกับvdivpd
และvsqrtpd
มีความละเอียดอ่อนและ AFAIK ไม่ใช่เอกสารทุกที่ ในการใช้งานส่วนใหญ่ฉันคิดว่ามีความเป็นไปได้น้อยที่จะทับซ้อนแม้ว่าข้อความในคู่มือแนะนำว่าหลายเธรดอาจมีความเป็นไปได้มากกว่าสำหรับการทับซ้อนในคำแนะนำนี้ เราสามารถกดจุดสูงสุดได้หากเราเริ่มต้นvaddpd
และvmulpd
ทุกรอบรวมเป็น 8 flops ต่อรอบ เมทริกซ์หนาแน่นเมทริกซ์คูณ ( dgemm
) สามารถเข้าใกล้จุดยอดนี้ได้พอสมควร
เมื่อนับ flops สำหรับคำแนะนำพิเศษฉันจะดูจำนวน FPU ที่ถูกครอบครอง สมมติว่าอาร์กิวเมนต์ในช่วงอินพุตของคุณvdivpd
ใช้เวลาโดยเฉลี่ย 24 รอบเพื่อให้เสร็จสมบูรณ์ครอบครองหน่วย M แต่การเพิ่มสามารถ (ถ้ามี) จะดำเนินการพร้อมกันครึ่งรอบ FPU มีความสามารถในการแสดงผล 24 แบบทวีคูณและ 24 ภาพเพิ่มเติมในระหว่างรอบเหล่านั้น ( ผสมผสานกันอย่างสมบูรณ์vaddpd
และvmulpd
) แต่ด้วย a vdivpd
สิ่งที่ดีที่สุดที่เราทำได้คือเพิ่มอีก 12 รายการ ถ้าเราคิดว่าวิธีที่ดีที่สุดในการแบ่งคือใช้ฮาร์ดแวร์ (สมเหตุสมผล) เราอาจนับvdivpd
"flops" ที่บรรจุ 36 รายการซึ่งบ่งชี้ว่าเราควรนับจำนวนสเกลาร์แต่ละตัวเป็น 36 "flops"
ด้วยรากที่สองซึ่งกันและกันบางครั้งก็เป็นไปได้ที่จะเอาชนะฮาร์ดแวร์โดยเฉพาะอย่างยิ่งถ้าไม่ต้องการความแม่นยำเต็มรูปแบบหรือถ้าช่วงของการป้อนข้อมูลแคบ ดังที่ได้กล่าวมาแล้วvrsqrtps
คำสั่งนั้นมีราคาไม่แพงมากดังนั้น (หากใช้ความแม่นยำเดียว) คุณสามารถทำvrsqrtps
ตามด้วยการทำซ้ำนิวตันหนึ่งหรือสองครั้งเพื่อล้างข้อมูล การทำซ้ำนิวตันเหล่านี้เป็นเพียง
y *= (3 - x*y*y)*0.5;
y = 1/sqrt(x)
ถ้าจำนวนมากของการดำเนินงานเหล่านี้จะต้องมีการดำเนินการนี้สามารถเป็นอย่างเร็วกว่าการประเมินผลที่ไร้เดียงสาของ ก่อนที่จะมีความพร้อมของฮาร์ดแวร์สแควร์รูตซึ่งกันและกันโดยประมาณโค้ดที่ไวต่อประสิทธิภาพบางตัวใช้การดำเนินการจำนวนเต็มที่น่าอับอายเพื่อค้นหาการคาดเดาเริ่มต้นสำหรับการทำซ้ำของนิวตัน
ฟังก์ชันคณิตศาสตร์ที่มีในไลบรารี
เราสามารถนำฮิวริสติกที่คล้ายกันไปใช้กับฟังก์ชั่นคณิตศาสตร์ที่มีในห้องสมุด คุณสามารถสร้างโปรไฟล์เพื่อกำหนดจำนวนคำสั่ง SSE แต่ตามที่เราได้กล่าวไปแล้วนั่นไม่ใช่เรื่องราวทั้งหมดและโปรแกรมที่ใช้เวลาทั้งหมดในการประเมินฟังก์ชั่นพิเศษอาจไม่ปรากฏว่าใกล้เคียงกับจุดสูงสุดซึ่งอาจเป็นจริง แต่ไม่ใช่ ไม่มีประโยชน์สำหรับการบอกคุณว่าเวลาทั้งหมดอยู่ในการควบคุมของคุณใน FPU
ฉันขอแนะนำให้ใช้ห้องสมุดคณิตศาสตร์เวกเตอร์ที่ดีเป็นพื้นฐาน (เช่น VML ของ Intel ส่วนของ MKL) วัดจำนวนรอบสำหรับการโทรแต่ละครั้งและคูณด้วยจำนวนครั้งสูงสุดที่ทำได้ผ่านจำนวนรอบนั้น ดังนั้นถ้าเลขชี้กำลังบรรจุนั้นใช้เวลา 50 รอบในการประเมินให้นับเป็น 100 flops คูณความกว้างของรีจิสเตอร์ น่าเสียดายที่ห้องสมุดคณิตศาสตร์เวคเตอร์บางครั้งยากที่จะโทรหาและไม่มีฟังก์ชั่นพิเศษทั้งหมดดังนั้นคุณอาจลงเอยด้วยการทำคณิตศาสตร์สเกลาร์ซึ่งในกรณีนี้คุณจะนับสเกลาร์เชิงสมมติฐานของเราเป็น 100 flops (แม้ว่ามันอาจจะยังคง 50 รอบดังนั้นคุณจะได้รับ 25% ของ "ยอด" ถ้าใช้เวลาทั้งหมดเพื่อประเมินเลขชี้กำลังเหล่านี้)
ตามที่คนอื่นพูดถึงคุณสามารถนับรอบและตัวนับเหตุการณ์ฮาร์ดแวร์โดยใช้ PAPI หรืออินเทอร์เฟซต่าง ๆ สำหรับการนับรอบอย่างง่ายคุณสามารถอ่านตัวนับรอบได้โดยตรงโดยใช้rdtsc
คำแนะนำพร้อมตัวอย่างข้อมูลประกอบแบบอินไลน์