มีระบบการสร้างใด ๆ ที่รวมเวลางานที่คาดหวังไว้ในกำหนดการหรือไม่


13

นี่เป็นภาพประกอบคำถามของฉัน:

สมมติว่างานสร้างที่ประกอบด้วยงานอิสระ 4 งานที่ชื่อว่า AD D ใช้เวลานานกว่า AC เป็นผลรวม

ระบบบิลด์ที่ไม่สามารถรวมเวลางานที่สัมพันธ์กันอาจกำหนดเวลางานดังนี้:

---------------------------------------
CPU1: A  |    C   |
---------------------------------------
CPU2: B    | D                        |
---------------------------------------

ในทางตรงกันข้ามหากตัวกำหนดตารางเวลาทราบความแตกต่างของเวลางานก็อาจเกิดขึ้นกับกำหนดการที่สั้นกว่านี้มาก:

---------------------------------------
CPU1: A  |  B    |   C   |
---------------------------------------
CPU2: D                        |
---------------------------------------

คำถามของฉัน:

  1. มีระบบการสร้างใด ๆ ที่รวมเวลางานที่คาดหวังไว้ในกำหนดการหรือไม่
  2. งานวิจัยเชิงวิชาการในการสร้างระบบประเภทนี้มีอยู่จริง?
  3. ระบบการสร้างเหล่านี้อยู่ที่ไหน (ถ้ามี) ใช้เวลาจากข้อมูล? การวิเคราะห์พฤติกรรมกำหนดเวลาที่รวบรวมในระหว่างการสร้างก่อนหน้า?
  4. หากระบบการสร้างดังกล่าวไม่มีอยู่ทำไม? มี gotcha ที่จะทำให้พวกเขาคุ้มค่าน้อยกว่าพวกเขาปรากฏตัวครั้งแรก?

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

1
ฉันคิดว่านี่เป็นไปตามข้อสันนิษฐานที่ผิด ๆ ว่า "การสร้าง" งานนั้นไม่ขนานกัน
dagnelies

ในกรณีส่วนใหญ่การสร้างงานนั้นไม่ใช่แบบขนาน แต่ใช่เช่นการทดสอบหน่วยในแอพพลิเคชันแบบมัลติเธรดสามารถขนานกันได้ ที่จริงแล้วในโครงการที่ฉันทำงานเราต้องเรียกใช้ "make" ด้วย "-j1" เสมอสำหรับการทดสอบหน่วยการเรียกใช้เพราะมิฉะนั้นประสิทธิภาพการทำงานที่เกี่ยวข้องกับการทดสอบหน่วยมัลติคอร์ล้มเหลว
juhist

@juhist ในกรณีที่คุณสนใจที่จะเปลี่ยนไปใช้ระบบการสร้างที่แสดงออกมากขึ้นสั่นมีแนวคิดของทรัพยากรที่คุณสามารถทำได้เช่นกำหนดจำนวนคอร์ CPU ที่ควรสำรองไว้สำหรับการทดสอบหน่วยของคุณ
sjakobi

คำตอบ:


3

Microsoft Visual Studio Team System (เดิมชื่อ TFS) จะพิจารณาเวลาการสร้างและการสร้างแบบขนาน มันต้องใช้ข้อมูลจากประวัติการสร้างก่อนหน้า; และในขณะที่ฉันไม่เชื่อว่าคุณสามารถรับพฤติกรรมที่คุณต้องการได้คุณสามารถปรับแต่งได้

ตัวอย่างของงานที่กำหนดเองเพื่อใช้ในการเพิ่มประสิทธิภาพ

https://veegens.wordpress.com/2013/03/26/tfs-2010-build-performance-report/


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

ไม่มีปัญหาสิ่งที่คุณอาจพลาดคือคุณสามารถปรับแต่งแอ็คชันการสร้างและกระบวนการบิลด์ผ่านการเขียนโปรแกรม ตัวอย่างถูกรายงาน แต่ตามที่ระบุไว้ประวัติจะถูกนำไปใช้เพื่อการปรับให้เหมาะสมอัตโนมัติ นอกจากนี้โปรดทราบว่าคุณสามารถกำหนดค่าการสร้างแบบขนาน แต่เพื่อให้แน่ใจว่าพวกเขาจะขนานตามอัลกอริทึมของคุณคุณอาจต้องปรับแต่งด้วยรหัส ข้อมูลอ้างอิงเพิ่มเติมบางส่วน: dotnetcurry.com/visualstudio/1177/…
Bruno Guardia

2
@BrunoGuardia: คุณสามารถอธิบายได้ว่าในบทความของลิงก์ของคุณเป็นตัวเลือกการปรับแต่งที่กล่าวถึงซึ่งสามารถช่วยในการใช้เวลางานที่คาดหวังของการดำเนินการสร้าง?
Doc Brown

0

นี่คือข้อสันนิษฐานที่ผิด ๆ ว่า "การสร้าง" งานนั้นไม่ขนานกัน

คอมไพเลอร์จำนวนมากทำงานแบบมัลติเธรดดังนั้นงานเดียว A จะใช้ CPU ทั้งหมด ดังนั้นลำดับไม่สำคัญ สำหรับ I / O ภาระผูกพันโดยเฉพาะอย่างยิ่งที่เกี่ยวข้องกับเครือข่ายเริ่มต้นได้ดีกว่าทั้งหมดตั้งแต่เริ่มต้นเช่นกัน: เวลาส่วนใหญ่จะใช้เวลารอคำตอบ

กล่าวอีกนัยหนึ่งการเรียงลำดับไม่สำคัญเนื่องจากงานแต่ละงานมักจะถูกขนานกัน (เช่นการคอมไพล์เป็นต้น)


แก้ไข:

ที่จริงแล้วความคิดของ "งาน A บน CPU 1" นั้นมีข้อบกพร่องเช่นกัน แม้สำหรับงานแบบเธรดเดียวระบบปฏิบัติการที่กำหนดเวลากระบวนการ / เธรดอาจกระโดดจาก CPU ไปยัง CPU ในแต่ละสวิตช์บริบท ฉันเดาว่าระบบการสร้างส่วนใหญ่จะใช้งานทั้งหมดในแบบคู่ขนานและปล่อยให้ระบบปฏิบัติการทำการตั้งเวลา ภารกิจที่ยาวนานจะใช้เวลานานขึ้นและนั่นก็เกี่ยวกับมัน

สมมติว่าคุณมีงานเธรดเดี่ยวที่ใช้เวลานานซึ่งไม่ถูกผูกไว้กับ I / Oมันจะเป็นวิธีที่ง่ายขึ้นสำหรับระบบบิลด์ที่จะกำหนดลำดับความสำคัญ / ความสำคัญแทนที่จะพยายามชะลองานที่เล็กลงเพื่อลดการสลับบริบทจากระบบปฏิบัติการ

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


"งานภายใน" ความเท่าเทียมเป็นสิ่งที่น่าสนใจและมีศักยภาพเพิ่มเติมสำหรับการเพิ่มประสิทธิภาพ แต่ฉันไม่คิดว่าถ้างานใด ๆ ที่กำหนดจะปรับขนาดได้อย่างมีประสิทธิภาพถึงจำนวนซีพียูที่ดีกว่าที่คิดว่าแต่ละงานต้องทำงานต่อไป แกนเดียว
sjakobi

@sjakobi: ในทางปฏิบัติมันค่อนข้างสำคัญที่คอมไพเลอร์มีประสิทธิภาพ คุณนึกภาพไหมว่าคุณรอการรวบรวมเป็นเวลานานเพราะมีเพียง 1 ใน 16 คอร์เท่านั้นที่ใช้? นั่นคือไม่ต้องไป ด้วยทฤษฎีทั้งหมดคุณดูเหมือนจะมองข้ามความเป็นจริง การตั้งเวลาเป็นหัวข้อที่น่าสนใจและมีความหมายมาก มันเป็นเพียง IMHO ค่อนข้างไร้ประโยชน์ในบริบทของการสร้างระบบ อีกครั้งผู้คอมไพล์เลอร์ส่วนใหญ่ทุกวันนี้มีหลายเธรดอยู่แล้ว ... และถ้าไม่ใช่พวกเขาจะต้องใช้ความพยายามมากกว่านี้ในการสร้างกำหนดการ
dagnelies

2
คอมไพเลอร์ซอฟต์แวร์ฟรีทั้งหมด ( GCC & Clang ... ) สำหรับ C ++ หรือ C หรือ Fortran หรือ Ada นั้นเป็นแบบเธรดเดี่ยว ระบบการสร้าง ( make -j) สามารถเริ่มกระบวนการรวบรวมหลายขนาน
Basile Starynkevitch

@BasileStarynkevitch: ... แน่นอน โดยทั่วไปทุกคนมีเหตุผลใช้-j <nb-cores>แต่น่าเศร้าที่ค่าเริ่มต้นยังคงเป็น "1" ... ฉันยังคงประหลาดใจที่ไม่เคยเปลี่ยน
dagnelies

@dagnelies: มี Makefiles จำนวนมากที่พลาดการพึ่งพาที่สำคัญบางอย่างและดังนั้นจึงไม่ทำงาน (หรืออาจใช้ไม่ได้) กับ -jN โดยที่ N> 1
juhist
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.