2009-01-05 43 views
139

Câu hỏi nhanh: cờ trình biên dịch cho phép g ++ sinh ra nhiều cá thể của chính nó để biên dịch các dự án lớn nhanh hơn (ví dụ 4 tệp nguồn tại một thời điểm cho CPU đa lõi) là gì?Biên dịch bằng g ++ sử dụng nhiều lõi

Rất cám ơn.

+0

Nó có thực sự giúp ích không? Tất cả các công việc biên dịch của tôi là I/O bị ràng buộc thay vì CPU bị ràng buộc. –

+4

Thậm chí nếu chúng là I/O bị ràng buộc, bạn có thể giữ tải I/O cao hơn khi các bit nặng CPU đang xảy ra (chỉ với một g ++ instance sẽ bị mất) và có thể đạt được hiệu quả I/O nếu scheduler có nhiều lựa chọn hơn về những gì cần đọc từ đĩa tiếp theo. Kinh nghiệm của tôi đã được rằng sử dụng khôn ngoan của 'make-j' hầu như luôn luôn dẫn đến một số cải tiến. – Flexo

+1

@BrianKnoblauch Nhưng trên máy tính của tôi (thực tế hoặc trong VirtualBox), đó là CPU bị ràng buộc, tôi thấy rằng CPU đang bận qua lệnh 'top' khi biên dịch. –

Trả lời

199

Bạn có thể làm điều này bằng cách thực hiện - với gnu làm cho nó là cờ -j (điều này cũng sẽ giúp trên một máy uniprocessor).

Ví dụ, nếu bạn muốn 4 công việc song song từ thực hiện:

make -j 4 

Bạn cũng có thể chạy gcc trong một ống với

gcc -pipe 

Điều này sẽ đường ống giai đoạn biên dịch, mà cũng sẽ giúp giữ các lõi bận rộn.

Nếu bạn có sẵn các máy bổ sung, bạn có thể xem distcc, trang trại này cũng sẽ biên dịch trang trại cho những người đó.

+30

Bạn là số -j phải là 1,5x số lõi bạn có. –

+0

có, một cái gì đó như thế có ý nghĩa cho có I/O là tốt - mặc dù có thể cần một số điều chỉnh nếu sử dụng -pipe cũng như – frankodwyer

+1

Cảm ơn. Tôi tiếp tục cố chuyển "-j #" sang gcc qua CFLAGS/CPPFLAGS/CXXFLAGS. Tôi đã hoàn toàn quên rằng "-j #" là một tham số cho GNU thực hiện (chứ không phải cho GCC). – chriv

7

make sẽ thực hiện việc này cho bạn. Điều tra các thiết bị chuyển mạch -j-l trong trang hướng dẫn. Tôi không nghĩ rằng g++ là song song.

+0

có thể giải thích danh sách dài các lỗi biên dịch ... –

2

Tôi không chắc chắn về g ++, nhưng nếu bạn đang sử dụng GNU Tạo "make -j N" (trong đó N là số chuỗi tạo có thể tạo) sẽ cho phép thực hiện nhiều tác vụ trên cùng một công việc thời gian (miễn là các tập tin không phụ thuộc vào nhau).

+2

không có N ist không phải là số lượng chủ đề! Nhiều người hiểu lầm điều đó, nhưng '-j N' cho biết làm thế nào nhiều quá trình cùng một lúc nên được sinh ra, chứ không phải đề tài. Đó là lý do tại sao nó không phải là biểu diễn như MS 'cl-MT' (thực sự đa luồng). – Sebi2020

36

Không có lá cờ như vậy và có một cờ chạy theo triết lý Unix của việc có từng công cụ thực hiện chỉ một hàm và thực hiện tốt. Các quá trình biên dịch sinh sản là khái niệm công việc của hệ thống xây dựng. Những gì bạn có thể tìm kiếm là cờ -j (công việc) cho GNU tạo, a la

make -j4

Hoặc bạn có thể sử dụng các hệ thống làm tương tự.

+0

http://www.gnu.org/software/make/manual/html_node/Parallel.html cũng http://www.gnu.org/software/make/manual/html_node/Options-Summary.html#Options -Summary –

+2

_ "Unix pedantry không phải là hữu ích" _ Điều tốt nó không phải là pedantry sau đó, vô danh biên tập viên. Cuộn lại. Người đánh giá vui lòng chú ý hơn đến những gì bạn đang làm. –

11

Mọi người đã đề cập make nhưng bjam cũng hỗ trợ khái niệm tương tự. Sử dụng bjam -jx chỉ thị bjam để xây dựng tối đa x lệnh đồng thời.

Chúng tôi sử dụng cùng một tập lệnh xây dựng trên Windows và Linux và sử dụng tùy chọn này giảm một nửa thời gian xây dựng của chúng tôi trên cả hai nền tảng. Tốt đẹp.

5

distcc cũng có thể được sử dụng để phân phối các biên dịch không chỉ trên máy hiện tại mà còn trên các máy khác trong một trang trại đã cài đặt distcc.

+0

+1, distcc là một công cụ hữu ích để có trong kho vũ khí của một người để xây dựng lớn. – Flexo

+0

Có vẻ như có một số ít hoạt động như "distcc": http://stackoverflow.com/questions/5374106/distributed-make/13770116#13770116 – rogerdpack

Các vấn đề liên quan