ทำไมคนแนะนำตัวเลือก -j3 สำหรับทำเมื่อมี CPU แบบดูอัลคอร์?


18

ใน Gentoo Linux เป็นไปได้ที่จะตั้งค่าMAKEOPTSตัวแปร/etc/portage/make.confเพื่อบอกmakeจำนวนงานที่ควรทำงานแบบขนานเมื่อสร้างแพ็คเกจ เนื่องจากฉันมีซีพียูแบบดูอัลคอร์ฉันจึงเลือกใช้-j2ตัวเลือกอย่างไร้เดียงสา: หนึ่งงานต่อคอร์ดังนั้นทั้งคู่จึงมีงานต้องทำ "ปัญหา" มีการอ้างอิงจำนวนมากที่บอกให้ผู้ใช้มี CPU แบบดูอัลคอร์เพื่อตั้งค่า-j3ตัวเลือกแทน บางส่วนของพวกเขาคือ:

ตัวอย่างเช่นคู่มือ Gentoo พูดว่า:

ทางเลือกที่ดีคือจำนวนของ CPU (หรือแกนประมวลผล CPU) ในระบบของคุณบวกหนึ่ง แต่แนวทางนี้อาจไม่สมบูรณ์แบบเสมอไป

แต่เหตุผลสำหรับกฎ "CPUs + 1" คืออะไร ทำไมต้องมีงานพิเศษ

make.conf (5) หน้าคนพูดถึง:

การตั้งค่าที่แนะนำอยู่ระหว่าง CPU + 1 และ 2 * CPUs + 1

ฉันยังอ่านหัวข้อ 5.4 (การเรียกใช้งานแบบขนาน) ในmakeหน้าข้อมูลและmakeคำอธิบายหน้า man สำหรับ-jตัวเลือก แต่ดูเหมือนว่าไม่มีคำตอบ



คำตอบ:


13

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

หากคุณได้รับพรจาก RAM จำนวนมากปัจจัยที่ จำกัด ในการคอมไพล์ที่ยาวนานจะเป็นเวลาของ CPU จากนั้นหนึ่งงานต่อ CPU รวมถึงงานที่ค้างอยู่หนึ่งช่วงสำหรับบล็อก I / O เหล่านั้นเป็นครั้งคราวเป็นการตั้งค่าที่ดี สิ่งนี้ทำให้มัน-j3เป็นซีพียูแบบดูอัลคอร์ (หรือแม่นยำกว่าสำหรับเครื่องดูอัลซีพียู - หากแต่ละคอร์นั้นมีไฮเปอร์เธรดเกิดขึ้นนั่นก็จะเป็น 4 ซีพียู-j5)

หากคุณมี RAM น้อยมากปัจจัยที่ จำกัด อาจเป็นเพราะคุณไม่สามารถมีงานพร้อมกันได้หลายอย่างไม่เช่นนั้นพวกเขาจะทำการแลกเปลี่ยนกันอย่างต่อเนื่อง ตัวอย่างเช่นถ้าคุณไม่สามารถสบายพอดีกับสองกรณีคอมไพเลอร์ในหน่วยความจำแล้วอาจจะช้ากว่าmake -j2 makeเนื่องจากสิ่งนี้ขึ้นอยู่กับจำนวนคอมไพเลอร์กระบวนการที่คุณสามารถพอดีกับแรมในครั้งเดียวจึงไม่มีวิธีที่จะได้รับร่างทั่วไป

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


ฉันไม่รู้ว่าถ้าแกนประมวลผล CPU ถูกไฮเปอร์เธรดจากนั้นแต่ละอันจะนับเป็นสอง อย่างไรก็ตามดูเหมือนว่าCPU ของฉันไม่รองรับ Hyper Threading
Francesco Turco

ฉันยอมรับคำตอบนี้ อย่างไรก็ตามฉันเลือกที่จะติดกับ-j2ในระบบของฉัน นี่เป็นเพราะฉันลองใหม่ทั้งสองgccและfirefoxด้วยการตั้งค่าจาก-j1สูงถึง-j5(สำหรับคำสั่งที่โผล่ออกมาทั้งหมด 10 คำ) และดูเหมือนว่าในขณะที่-j2เร็วกว่า-j1การตั้งค่าอื่น ๆ อีกสาม-j2อย่าง
Francesco Turco

7

ฉันเดาว่านี่เป็นวิธีแก้ปัญหาแบบธรรมชาติ - การอนุญาตให้เรียกmakeใช้งานโปรเซสCPUs + 1คือการทำให้แน่ใจว่า:

  1. จะไม่มีช่องว่างระหว่างกระบวนการของผู้ปฏิบัติงานซึ่งเพิ่งเสร็จสิ้นและผู้ปฏิบัติงานที่ยังไม่ได้ทำงาน - ค่อนข้างคล้ายกับคิวการดำเนินการเติมล่วงหน้า
  2. จะไม่มีกระบวนการแข่งขันมากเกินไปที่จะนำค่าใช้จ่ายที่เห็นได้ชัดเจนกับการเติมคิวการทำงานล่วงหน้า

แต่อีกครั้งนั่นเป็นการแก้ปัญหาและคู่มือ FreeBSD ยังคงแนะนำ make -j4ให้ใช้ CPU ตัวเดียว


5

โดยทั่วไปมีเหตุผลที่จะเริ่มงานมากกว่าจำนวนแกน สำหรับการคอมไพล์ C โดยใช้ gcc หากไม่ได้กำหนด -pipe ไว้ในตัวเลือก gcc มันจะทำการกระทำของมัน (การประมวลผลล่วงหน้า, การรันครั้งแรก, การปรับให้เหมาะสมที่สุดและแอสเซมบลี) ตามลำดับโดยใช้ไฟล์ชั่วคราว -pipe เปลี่ยนแปลงสิ่งนี้เป็นการใช้ไพพ์ระหว่างกระบวนการย่อย (การเพิ่ม -pipe เป็นค่าเริ่มต้นเช่นสำหรับ FreeBSD แต่ไม่ใช่แบบดั้งเดิมบน Linux) ดังนั้นหากคุณมี 2 คอร์และอนุญาตให้มี 2 งานพร้อมกันพวกเขาจะใช้เวลาในดิสก์ I / O คำแนะนำในการเพิ่ม 1 งานดูเหมือนจะเกี่ยวข้องกับข้อมูลเฉพาะนี้ แต่เพื่อให้ได้คำตอบสุดท้ายคุณควรค้นหาว่าใครและเมื่อใดที่เพิ่มคำแนะนำนี้และถามเขา :) หรือถามในรายชื่อผู้รับจดหมายของ Gentoo Devels


2

โดยทั่วไปตัวเลขนั้นเป็นสิ่งที่ผู้เขียนเรียกสามัญสำนึก ที่ดีที่สุดก็เดาดี เท่าที่ฉันรู้กระบวนการสร้างที่เกิดขึ้นเมื่อคุณพิมพ์makeแล้วนับเพื่อให้-j3คุณสามารถจบลงด้วยกระบวนการหลักที่รอในขณะที่ทั้งสองกำลังรวบรวม

แต่กลับมาเมื่อผมใช้ Gentoo <#cpus>*2 + 1กฎของหัวแม่มือถูก

ทุกอย่างขึ้นอยู่กับเส้นทางไก่ใบชาหรือลูกบอล 8 ลูกของคุณบอกคุณเกี่ยวกับดิสก์ I / O ที่จำเป็นต้องมีและการกำหนดตารางเวลาของเคอร์เนล linux ปัจจุบันของคุณ [เริ่มต้นแกนของโพสต์นี้] จากประสบการณ์ส่วนตัวของฉัน ( -jไม่ใช่เฉพาะ Gentoo) ทุกอย่างระหว่าง #cpus + 1 และ #cpus * 2 +1 ให้ผลลัพธ์ที่ดี [จบแกนกลางของโพสต์นี้] และโดยเฉลี่ยแล้วคุณแทบจะไม่สังเกตเห็นความแตกต่าง โปรเซสเซอร์และเมล็ดในวันนี้ค่อนข้างดี

แต่การเปลี่ยนแปลงทั้งหมดนี้เมื่อ: ก) คุณใช้มากกว่าหนึ่งช่องในการคอมไพล์ (du'h) หรือ b) กำลังพัฒนาโค้ดของคุณเอง

-jแอตทริบิวต์ที่สูงกว่ามีแนวโน้มที่จะแสดงการขึ้นต่อกันที่ไม่รู้จักก่อนหน้านี้

และในหมายเหตุด้าน: อย่าไปตามจำนวนคอร์ แต่ตามจำนวนสตรีมที่เกิดขึ้นพร้อมกันที่ซีพียูใช้ (Hypertheading!)

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