คำถามด่วน: ธงคอมไพเลอร์คืออะไรที่อนุญาตให้ 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