มีการใช้เธรดจำนวนเท่าใด


11

เมื่อฉัน (อีกครั้ง) สร้างระบบขนาดใหญ่บนคอมพิวเตอร์เดสก์ท็อป / แล็ปท็อปฉันบอกmakeให้ใช้มากกว่าหนึ่งเธรดเพื่อเร่งความเร็วในการรวบรวมเช่นนี้:

$ make -j$[ $K * $C ]

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

ตัวอย่างเช่นฉันอาจบอกว่าmake -j12ฉันมี 4 แกนระบุว่าmakeจะใช้ถึง 12 กระทู้


เหตุผลของฉันคือถ้าฉันใช้เฉพาะ$Cเธรดแกนจะว่างขณะที่กระบวนการกำลังดึงข้อมูลจากไดรฟ์ แต่ถ้าฉันไม่ จำกัด จำนวนเธรด (เช่นmake -j) ฉันเสี่ยงที่จะเสียเวลาในการสลับบริบท, หน่วยความจำไม่เพียงพอหรือแย่กว่านั้น สมมติว่าเครื่องมี$Mหน่วยความจำกิ๊ก ( $Mอยู่ในอันดับ 10)

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


ในหลายกรณีคำตอบที่ถูกต้องสำหรับจำนวนเธรดจะเป็นจำนวนแกน แต่วิธีเดียวที่จะทราบได้อย่างแน่นอนคือทำการทดสอบโดยเปลี่ยนจำนวนเธรดจนกว่าคุณจะพบจุดที่น่าสนใจ
Robert Harvey

@RobertHarvey: ใช่ฉันอาจจะไปและมีสคริปต์เชลล์รวบรวมการตั้งค่าทุกประเภทข้ามคืน แต่ฉันคิดว่าฉันถามว่ามีความรู้เกี่ยวกับเรื่องนี้ที่นั่นหรือไม่
bitmask

4
หลายคนแนะนำ $ cores + 1 ดังนั้น 1 คอมไพเลอร์กระบวนการอ่านจากดิสก์ในขณะที่ 4 คอมไพล์ ข้อเสนอแนะทั่วไปนั้นยากขึ้นอยู่กับรหัสฐาน (เทมเพลต C ++ มากเกินไปเทียบกับหน่วยคอมไพล์เล็ก ๆ ที่มีฟังก์ชั่น C น้อย), คอมไพเลอร์เชน (ส่วนหัวคอมไพล์แล้ว ฯลฯ ) และโครงสร้างการสร้าง จบหรือสิ่งที่มีขนาดเล็กหลายแห่งในระหว่าง)
โยฮันเน

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

@TMN: RAM ดิสก์ช่วยอย่างไร ลินุกซ์สวยดีที่แคชสิ่งที่ (คุณทำหมายถึงไฟล์ส่วนหัวใช่มั้ย?) ไม่พูดถึงแคชไดรฟ์ ฉันจะต้องโหลดทุกอย่างลงใน shm ก่อนไม่ว่าจะด้วยตนเองหรือโดยการเปลี่ยนสคริปต์การสร้าง (ซึ่งจะเป็น overkill ที่สุด)
bitmask

คำตอบ:


15

ฉันใช้ชุดทดสอบสร้าง llvm (ในโหมด Debug + Asserts) บนเครื่องที่มีสองคอร์และ RAM 8 GB:

รวบรวมเวลา llvm ขึ้นอยู่กับจำนวนของงาน

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

ขั้นต่ำน่าจะเป็น7*$coresในกรณีนี้


1
+1 สำหรับการทดสอบจริงและไม่เก็งกำไร
Martin Wickman

3

ฉันใช้ Gentoo Linux (กระจายตามแหล่งที่มา) และจากประสบการณ์ของฉันฉันสามารถพูดได้ว่า (ด้วยฮาร์ดแวร์ล่าสุดหรือน้อยกว่า) n*2 + xเป็นค่าที่ดีที่สุด ให้ฉันอธิบายสิ่งนี้:

  • n*2: CPU ที่ช้ากว่ามีกำลังมากพอที่จะรัน 2 งานพร้อมกัน งานการคอมไพล์ส่วนใหญ่จะเสร็จสิ้นอย่างรวดเร็วมาก
  • +xจำนวนนี้ขึ้นอยู่กับระบบของคุณ (ส่วนใหญ่หน่วยความจำและดิสก์) ถ้าคุณมี RAM x=nเพียงพอและดิสก์ได้อย่างรวดเร็วชุด อย่างไรก็ตามสิ่งนี้ขึ้นอยู่กับซอร์สโค้ด (Open Office ฉันกำลังมองคุณ!) และภาษาที่ใช้ (การคอมไพล์ C / C ++ เป็นหน่วยความจำที่เข้มข้นมาก)

อย่างไรก็ตามคุณต้องทำการทดสอบด้วย-jค่าบางค่าเพื่อให้ได้จำนวนที่ดีที่สุด ยังพยายามที่จะคู่ขนานขั้นตอนอื่น ๆ ของการสร้างกระบวนการ: การเอาออกวิ่งconfigureและอื่น ๆ


ฉันกังวลกับ C ++ เป็นส่วนใหญ่ในขณะนี้และดิสก์ของฉันไม่ใช่วิธีที่เร็วที่สุดฉันเดา
bitmask

จากนั้นเริ่มต้นด้วย n * 1.5 และเพิ่มจนกระทั่งเวลาคอมไพล์หยุดหยุดลดลง (ตรวจสอบให้แน่ใจว่าคุณล้างแคชดิสก์ / แคชคอมไพล์ทุกครั้ง) นอกจากนี้ลองนึกถึงการใช้ ccache ( ccache.samba.org ) เพื่อเร่งการรวบรวม
ercpe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.