การทำโปรไฟล์รหัส CFD ด้วย Callgrind


16

ฉันใช้ Valgrind + Callgrind เพื่อทำหน้าที่แก้ปัญหาที่ฉันเขียน ในฐานะที่เป็นคู่มือผู้ใช้ Valgrind ฉันได้รวบรวมรหัสของฉันพร้อมตัวเลือกการดีบักสำหรับคอมไพเลอร์:

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

คู่มือ Valgrind

เมื่อคอมไพล์ด้วยตัวเลือกการดีบักรหัสจะทำงานช้าลงมาก รหัส CFD ช้ามาก ๆ แม้ในกรณีเล็ก ๆ เมื่อคอมไพล์ด้วยแฟล็กการดีบัก Valgrind ทำให้ช้าลง 40x (ดูคู่มือ1 )

  1. คุณใช้เครื่องมือใดในการทำโปรไฟล์โค้ด (การทำโปรไฟล์ไม่ใช่การทำเกณฑ์เปรียบเทียบ)?

  2. คุณให้โค้ดทำงานนานแค่ไหน (สถิติ: กี่ขั้นตอน)

  3. เคสมีขนาดใหญ่เท่าใด (ถ้าเคสพอดีกับแคชตัวแก้คำสั่งจะมีขนาดเร็วขึ้น แต่แล้วฉันจะพลาดกระบวนการที่เกี่ยวข้องกับหน่วยความจำ)


3
คุณสามารถรวบรวมรหัสที่มีสัญลักษณ์การดีบักและเปิดใช้งานการปรับให้เหมาะสม ถึงกระนั้น 40x ถึง valgrind (ซึ่งจำลองการเข้าถึงหน่วยความจำทั้งหมด) นั้นไม่สมเหตุสมผล
Aron Ahmadia

ขอบคุณนี่คือสิ่งที่ฉันได้อ่านเช่นกัน ... สิ่งที่ฉันอยากรู้คือข่าวสารเกี่ยวกับประสบการณ์ทุกวันในการทำโปรไฟล์ (โดยมี valgrind โดยเฉพาะ): เวลาเท่าไหร่ที่จะรอรายงานเป็นเท่าไร ฉันต้องนับสิ่งที่ฉันสามารถแยกได้ ... ฯลฯ ...
tmaric

คำถามของคุณค่อนข้างกว้าง ฉันขอแนะนำให้แก้ไขคำถามของคุณให้จดจ่อกับ Q2.1 และ Q2.2 เนื่องจาก Q1 เป็นคำถามที่แตกต่างไปจากเดิมอย่างสิ้นเชิง (ฉันยินดีที่คุณถามแยกต่างหากมันเป็นคำถามที่ดี แต่วลีว่า "เครื่องมือใดที่คุณต้องการ ใช้เพื่อแก้ปัญหา X "โดยที่ X อธิบายได้ดี!) ในขณะที่ Q2 ของมันนั้นกว้างเกินไป
Aron Ahmadia

คุณยังสามารถแก้ไขให้เป็นชื่อcallgrind, หรือcachegrind massifหลายคนเชื่อมโยง Valgrind กับเครื่องมือเริ่มต้นเท่านั้น ( memcheck) ในฐานะที่เป็นระบบทำโปรไฟล์แบบจำลอง (แทนที่จะใช้ระบบอินเตอร์รัปต์) คุณไม่จำเป็นต้องรันเป็นเวลานาน
Jed Brown

@Aron & Jed: ขอบคุณสำหรับเคล็ดลับฉันได้แก้ไขคำถาม :)
tmaric

คำตอบ:


11

Q1: คุณใช้เครื่องมือใดในการทำโปรไฟล์รหัส (การทำโปรไฟล์ไม่ใช่การทำเกณฑ์เปรียบเทียบ)?

Q2: คุณให้โค้ดทำงานนานแค่ไหน (สถิติ: ขั้นตอนกี่ครั้ง)

คำถามที่ 3: กรณีมีขนาดใหญ่แค่ไหน (ถ้ากรณีเหมาะสมกับแคชตัวแก้คำสั่งจะมีขนาดเร็วขึ้น แต่แล้วฉันจะพลาดกระบวนการที่เกี่ยวข้องกับหน่วยความจำ)

นี่คือตัวอย่างของวิธีที่ฉันทำ

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

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

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

จากประสบการณ์ของฉันจากตัวอย่างมากมายนี่คือวิธี: ฉันสามารถค้นหาปัญหาหนึ่ง (โดยการหยุดชั่วคราวแบบสุ่ม) และแก้ไขได้รับความเร็วร้อยละ 30 พูดหรือ 1.3x จากนั้นฉันก็สามารถทำได้อีกครั้งพบปัญหาอื่นและแก้ไขได้รับความเร็วเพิ่มอีกอาจน้อยกว่า 30% อาจจะมากกว่า จากนั้นฉันสามารถทำมันได้อีกหลายครั้งจนกระทั่งฉันไม่พบสิ่งใดที่จะแก้ไขได้อีก ปัจจัยเร่งความเร็วที่ดีที่สุดคือผลิตภัณฑ์ที่ทำงานของแต่ละปัจจัยและอาจมีขนาดใหญ่อย่างน่าประหลาดใจ - ลำดับความสำคัญในบางกรณี

แทรก: เพียงเพื่อแสดงให้เห็นถึงจุดสุดท้ายนี้ มีตัวอย่างโดยละเอียดที่นี่พร้อมการนำเสนอภาพนิ่งและไฟล์ทั้งหมดซึ่งแสดงให้เห็นว่าการเร่งความเร็ว 730x ทำได้สำเร็จในการลบปัญหา รุ่นแรกใช้เวลา 2700 ไมโครวินาทีต่อหน่วยงาน ปัญหา A ถูกนำออกซึ่งทำให้เวลาลดลงเหลือ 1,800 และขยายเปอร์เซ็นต์ของปัญหาที่เหลืออยู่ 1.5 เท่า (2700/1800) จากนั้น B ก็ถูกลบออก กระบวนการนี้ดำเนินไปเรื่อย ๆ ผ่านการทำซ้ำหกครั้งส่งผลให้มีการเร่งความเร็วของคำสั่งเกือบ 3 ครั้ง แต่เทคนิคการทำโปรไฟล์จะต้องมีประสิทธิภาพจริงๆเพราะถ้าหากปัญหาเหล่านั้นไม่พบเช่นถ้าคุณไปถึงจุดที่คุณคิดว่าไม่ถูกต้องจะไม่สามารถทำได้อีกต่อไป

คำอธิบายของการลบปัญหาต่าง ๆ เพื่อรับการเร่งความเร็วขนาดใหญ่

แทรก: เมื่อต้องการใส่อีกวิธีหนึ่งนี่คือกราฟของปัจจัยเร่งความเร็วโดยรวมเนื่องจากปัญหาจะถูกลบอย่างต่อเนื่อง:

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นสำหรับไตรมาสที่ 1 สำหรับการเปรียบเทียบการจับเวลาอย่างง่าย สำหรับ "การทำโปรไฟล์" ฉันใช้การหยุดแบบสุ่ม

Q2: ฉันให้ปริมาณงานเพียงพอ (หรือใส่วนรอบมัน) ดังนั้นมันจึงทำงานได้นานพอที่จะหยุดชั่วคราว

Q3: โดยทั้งหมดให้ภาระงานที่มีขนาดใหญ่แนบเนียนเพื่อให้คุณไม่พลาดปัญหาแคช สิ่งเหล่านั้นจะปรากฏเป็นตัวอย่างในรหัสที่ทำการดึงหน่วยความจำ


คุณมีวิธีการหยุดสุ่มในกรณีที่ไม่มี IDE เชิงภาพหรือไม่? กระบวนการนี้เป็นไปโดยอัตโนมัติได้ไหม?
Matthew Emmett

@ Matewew: ฉันเข้าใจว่ามีเครื่องมือที่ชอบpstackและlsstackแต่ฉันคิดว่านี่เป็นกระบวนการที่เหมือนกันมากขึ้นด้วยการแก้ไขข้อบกพร่อง ดังนั้นแม้ว่าดีบักเกอร์ที่ดีที่สุดที่ฉันสามารถนำมาใช้ได้คือgdbมันทำให้งานเสร็จ ด้วยดีบักเกอร์คุณสามารถตรวจสอบข้อมูลและสามารถสร้างความแตกต่างเมื่อสแต็คเพียงอย่างเดียวไม่ได้บอกคุณเพียงพอ
Mike Dunlavey

9

ผู้สร้างโปรไฟล์ของชายยากจนนั้นเป็นgdbสคริปต์ที่สุ่มตัวอย่าง call stack คุณจะต้องมีสัญลักษณ์การดีบัก มันยังคงช้า แต่เนื่องจากมันไม่ได้ใช้เครื่องเสมือนเพื่อเรียกใช้รหัสบนมันมักจะเร็วกว่าcallgrindและเพียงพอกับงาน

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


1
+ การไม่มีหลักฐานไม่ใช่หลักฐานการขาด :) สิ่งที่ผู้สร้างโปรไฟล์ของคนจนควรทำคือใช้ร่องรอยน้อยลงและไม่ยุบพวกเขา แต่ให้คุณเห็นพวกเขา สายตามนุษย์ดีกว่าในการตรวจจับรูปแบบที่มีประโยชน์มากกว่าการประมาณเวลาฟังก์ชั่นที่เรียบง่ายและถ้าคุณเห็นบางสิ่งที่คุณสามารถปรับปรุงได้จากตัวอย่างเพียง 2 ตัวอย่างมันจะช่วยได้มาก เศษส่วน X ที่จะบันทึกคือการแจกแจงแบบเบต้าด้วยโหมด 2 / N โดยที่ N คือจำนวนร่องรอยที่คุณตรวจสอบและปัจจัยเร่งความเร็วจะเป็น 1 / (1-X) ซึ่งอาจมีขนาดใหญ่
Mike Dunlavey

2

เพื่อเพิ่มคำตอบที่ยอดเยี่ยมมีเครื่องมือที่พัฒนาขึ้นที่ Rice ซึ่งทำการสุ่มตัวอย่างแบบสแต็กโดยอัตโนมัติดังนั้นจึงมีค่าใช้จ่ายน้อยมาก:

http://hpctoolkit.org/


ดูดี แต่ฉันขอโทษที่สวมหมวกไฟนี่ ฉันไม่ได้ปรับแต่งโค้ดที่คอมไพเลอร์ให้เหมาะสมเพราะมันยากที่จะดูว่าเกิดอะไรขึ้นในโค้ดที่เขียนด้วยภาษา mangled สิ่งที่ฉันตัดแต่งกิ่งไม่ใช่สิ่งที่เครื่องมือเพิ่มประสิทธิภาพสามารถจัดการได้ - เช่นการโทรexpและlogมีข้อโต้แย้งซ้ำ ๆ กันหรือการดำเนินการกับเมทริกซ์ใช้ตัวเลือกการถอดรหัสตลอดเวลา ฉันปรับเท่าที่จะทำได้จากนั้นเปิด -O3
Mike Dunlavey

เครื่องมือเป็นเครื่องมือและมีประโยชน์เฉพาะเมื่อผู้ใช้รู้และเข้าใจถึงข้อ จำกัด ของพวกเขา ฉันไม่คิดว่าจะมี "ผู้สร้างโปรไฟล์ที่สมบูรณ์แบบ" ซึ่งจะลบผู้ใช้ออกจากสมการทั้งหมดด้วยความเคารพต่อความเข้าใจในผลลัพธ์และการรู้วิธีการใช้ข้อมูล
Reid.Atcheson

1

Allinea MAPเป็นผู้พัฒนาตัวอย่างเชิงพาณิชย์ที่ได้รับการพัฒนาและรองรับการสุ่มตัวอย่าง profiler ดังนั้น - เช่นเดียวกับ HPC Toolkit ที่แนะนำในคำตอบก่อนหน้านี้ - สามารถทำงานในขนาดงานผลิตได้หากคุณต้องการ

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

มักจะมีผลไม้ที่มีประสิทธิภาพต่ำซึ่งอยู่นอกแกนหลักของรหัส CFD ในพื้นที่ที่ไม่คาดคิด การสุ่มตัวอย่างแบบสแต็กแบบสุ่มคือ - ไม่ว่าจะทำด้วยตนเองกับ GDB หรือด้วยเครื่องมือเช่น HPC Toolkit และ Allinea MAP - วิธีที่ดีที่สุดในการค้นหา หากสิ่งที่สำคัญต่อประสิทธิภาพนั้นจะปรากฏขึ้น

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