คำถามด่วน: ธงคอมไพเลอร์คืออะไรที่อนุญาตให้ g ++ วางไข่หลายอินสแตนซ์ของตัวเองเพื่อรวบรวมโครงการขนาดใหญ่ได้เร็วขึ้น (เช่นไฟล์ต้นฉบับ 4 ไฟล์ในเวลาเดียวกันสำหรับ CPU แบบมัลติคอร์)?
make -jเกือบทุกครั้งจะทำให้เกิดการปรับปรุง
คำถามด่วน: ธงคอมไพเลอร์คืออะไรที่อนุญาตให้ g ++ วางไข่หลายอินสแตนซ์ของตัวเองเพื่อรวบรวมโครงการขนาดใหญ่ได้เร็วขึ้น (เช่นไฟล์ต้นฉบับ 4 ไฟล์ในเวลาเดียวกันสำหรับ CPU แบบมัลติคอร์)?
make -jเกือบทุกครั้งจะทำให้เกิดการปรับปรุง
คำตอบ:
คุณสามารถทำได้ด้วย make - ด้วย gnu ทำให้เป็นแฟล็ก -j (สิ่งนี้จะช่วยในเครื่องตัวประมวลผลเดียว)
ตัวอย่างเช่นถ้าคุณต้องการให้ 4 งานแบบขนานจาก make:
make -j 4
คุณยังสามารถเรียกใช้ gcc ในไปป์ด้วย
gcc -pipe
ขั้นตอนนี้จะเป็นการรวบรวมขั้นตอนการคอมไพล์ซึ่งจะช่วยให้แกนไม่ว่าง
หากคุณมีเครื่องจักรเพิ่มเติมด้วยเช่นกันคุณอาจตรวจสอบdistccซึ่งฟาร์มจะรวบรวมข้อมูลเหล่านั้นเช่นกัน
-jโต้แย้ง
ไม่มีการตั้งค่าสถานะดังกล่าวและมีหนึ่งทำงานกับปรัชญา Unix ของการมีเครื่องมือแต่ละตัวทำงานเพียงหนึ่งฟังก์ชั่นและทำงานได้ดี กระบวนการคอมไพเลอร์วางไข่เป็นแนวคิดงานของระบบสร้าง สิ่งที่คุณกำลังมองหาคือการตั้งค่าสถานะ -j (งาน) เพื่อ GNU, a la
ทำ -j4
หรือคุณสามารถใช้ pmake หรือระบบสร้างขนานที่คล้ายกัน
ผู้คนได้กล่าวถึงmakeแต่bjamยังสนับสนุนแนวคิดที่คล้ายกัน การใช้bjam -jxสั่งให้ bjam สร้างxคำสั่งพร้อมกัน
เราใช้สคริปต์การสร้างเดียวกันบน Windows และ Linux และการใช้ตัวเลือกนี้จะลดเวลาการสร้างของเราลงทั้งสองแพลตฟอร์ม ดี
makeจะทำสิ่งนี้เพื่อคุณ ตรวจสอบ-jและ-lสลับในหน้าคน ฉันไม่คิดว่าg++มันขนานกันได้
-lตัวเลือกการกล่าวถึง(ไม่เริ่มงานใหม่เว้นแต่งานก่อนหน้านี้ทั้งหมดยุติลง) มิฉะนั้นดูเหมือนว่างานตัวลิงก์เริ่มต้นด้วยไม่ใช่วัตถุไฟล์ทั้งหมดที่สร้างขึ้น (เนื่องจากการรวบรวมบางส่วนยังคงดำเนินต่อไป) เพื่อให้งานตัวเชื่อมโยงล้มเหลว
-jถ้าใช้ทำให้ปัญหากับ จากman make:
-j [jobs], --jobs[=jobs] Specifies the number of jobs (commands) to run simultaneously. If there is more than one -j option, the last one is effective. If the -j option is given without an argument, make will not limit the number of jobs that can run simultaneously.
และที่สำคัญที่สุดคือถ้าคุณต้องการเขียนสคริปต์หรือระบุจำนวนแกนประมวลผลที่คุณมีอยู่ (ขึ้นอยู่กับสภาพแวดล้อมของคุณและหากคุณใช้งานในหลาย ๆ สภาพแวดล้อมสิ่งนี้สามารถเปลี่ยนแปลงได้มากมาย) คุณอาจใช้ฟังก์ชัน Python ทั่วไปcpu_count():
https://docs.python.org/3/library/multiprocessing.html#multiprocessing.cpu_count
แบบนี้:
make -j $(python3 -c 'import multiprocessing as mp; print(int(mp.cpu_count() * 1.5))')
หากคุณกำลังถามว่าทำไม1.5ฉันจะพูดผู้ใช้ไร้เสียงในความคิดเห็นข้างต้น:
หมายเลข 1.5 เป็นเพราะปัญหาการผูก I / O ที่บันทึกไว้ มันเป็นกฎง่ายๆ ประมาณ 1/3 ของงานที่จะรอ I / O ดังนั้นงานที่เหลือจะใช้แกนที่มีอยู่ จำนวนที่มากกว่าคอร์นั้นดีกว่าและคุณสามารถสูงได้ถึง 2x
make -j`nproc` กับnprocใน GNU coreutils
make -j $(( $(nproc) + 1 ))(ตรวจสอบให้แน่ใจว่าคุณใส่ช่องว่างที่ฉันมี)
nprocไม่สามารถใช้ได้เช่นในmanylinux1ภาชนะบรรจุที่มันจะช่วยประหยัดเวลาเพิ่มเติมโดยการหลีกเลี่ยงการทำงาน/yum update yum install
distcc สามารถใช้เพื่อแจกจ่ายคอมไพล์ไม่เพียง แต่ในเครื่องปัจจุบัน แต่ยังสามารถใช้กับเครื่องอื่น ๆ ในฟาร์มที่ติดตั้ง distcc
ฉันไม่แน่ใจเกี่ยวกับ g ++ แต่ถ้าคุณใช้ GNU Make แล้ว "make -j N" (โดยที่ N คือจำนวนเธรดที่สามารถสร้างได้) จะอนุญาตให้ make รันงาน multple g ++ ในเวลาเดียวกัน (นานมาก เนื่องจากไฟล์ไม่ได้ขึ้นอยู่กับแต่ละไฟล์)
-j Nบอกให้ทำจำนวนกระบวนการในครั้งเดียวควรจะเกิดขึ้นไม่ใช่หัวข้อ นั่นเป็นเหตุผลว่าทำไมมันจึงไม่เป็นเช่นเดียวกับ MS cl -MT(มัลติเธรดจริงๆ)
GNU ขนาน
ฉันสร้างมาตรฐานการรวบรวมสังเคราะห์และไม่สามารถใส่ใจในการเขียน Makefile ดังนั้นฉันจึงใช้:
sudo apt-get install parallel
ls | grep -E '\.c$' | parallel -t --will-cite "gcc -c -o '{.}.o' '{}'"
คำอธิบาย:
{.} รับอาร์กิวเมนต์อินพุตและลบส่วนขยาย-t พิมพ์คำสั่งที่กำลังทำงานอยู่เพื่อแจ้งให้เราทราบถึงความคืบหน้า--will-cite ลบคำขอเพื่ออ้างอิงซอฟต์แวร์หากคุณเผยแพร่ผลลัพธ์โดยใช้ ...parallel สะดวกมากที่ฉันสามารถตรวจสอบเวลาได้ด้วยตนเอง:
ls | grep -E '\.c$' | parallel -t --will-cite "\
if ! [ -f '{.}.o' ] || [ '{}' -nt '{.}.o' ]; then
gcc -c -o '{.}.o' '{}'
fi
"
xargs -Pยังสามารถเรียกใช้งานแบบขนาน แต่มันสะดวกน้อยกว่าเล็กน้อยในการจัดการส่วนขยายหรือเรียกใช้หลายคำสั่งด้วยการเรียกคำสั่งหลายคำสั่งผ่าน xargs
มีการถามการเชื่อมโยงแบบขนานที่: gcc สามารถใช้หลายคอร์เมื่อเชื่อมโยง
สิ่งที่ต้องทำ: ฉันคิดว่าฉันอ่านที่ไหนสักแห่งว่าการรวบรวมสามารถลดการคูณเมทริกซ์ดังนั้นอาจเป็นไปได้ที่จะเพิ่มความเร็วในการรวบรวมไฟล์เดียวสำหรับไฟล์ขนาดใหญ่ แต่ตอนนี้ฉันไม่สามารถหาข้อมูลอ้างอิงได้
ทดสอบใน Ubuntu 18.10