2010-12-13 92 views
10

Bây giờ gần như mọi người dùng đều có 2 hoặc 4 lõi trên máy tính để bàn (và trên số lượng lớn sổ ghi chép). Người dùng có 6-12 lõi với amd hoặc i7.Trình biên dịch x86 C++ nào được đa luồng bởi chính nó?

Trình biên dịch C/C++ x86/x86_64 nào có thể sử dụng một số luồng để thực hiện quá trình biên dịch?

Đã có giải pháp giống như 'make -j N', nhưng đôi khi (đối với -fwhole-program hoặc -ipo) có bước lớn và chậm cuối cùng, bắt đầu tuần tự.

Có bất kỳ công cụ nào trong số này có thể: GCC, Trình biên dịch C++ của Intel, trình biên dịch Borland C++, Open64, LLVM/GCC, LLVM/Clang, Trình biên dịch mặt trời, MSVC, OpenWatcom, Pathscale, PGI, TenDRA, Digital Mars?

Có số giới hạn số chuỗi cho trình biên dịch cao hơn, đa luồng không?

Cảm ơn!

Trả lời

0

Đối với Visual C++, tôi không biết liệu nó có biên dịch song song hay không (tôi không nghĩ vậy). Đối với các phiên bản sau Visual Studio 2005 (tức là Visual C++ 8), các dự án trong một giải pháp được xây dựng song song theo như được cho phép bởi biểu đồ phụ thuộc giải pháp.

+1

Như bạn nói, các dự án riêng lẻ trong một giải pháp được biên dịch song song. Một dự án duy nhất được biên dịch trên một lõi đơn, một luồng. Bước liên kết là một luồng đơn. –

+0

@John - cảm ơn sự xác nhận –

6

Một số hệ thống xây dựng có thể biên dịch các mô đun độc lập song song, nhưng bản thân các trình biên dịch vẫn là một luồng đơn. Tôi không chắc chắn có bất cứ điều gì để đạt được bằng cách làm cho trình biên dịch đa luồng. Giai đoạn biên dịch tốn nhiều thời gian nhất là xử lý tất cả các phụ thuộC#include và chúng để được xử lý tuần tự do phụ thuộc tiềm năng giữa các tiêu đề khác nhau. Các giai đoạn biên dịch khác phụ thuộc rất nhiều vào kết quả của các giai đoạn trước, do đó, có rất ít lợi ích để đạt được từ song song ở đó.

+2

Việc tốn nhiều thời gian nhất là tối ưu hóa với mức cao (O2, O3) và tối ưu hóa -ipo. – osgx

+2

Tạo mã và tối ưu hóa toàn cầu cũng mất nhiều thời gian, và nó * có thể * được thực hiện song song. – ybungalobill

+0

Bạn không thể có các chương trình đa luồng xây dựng một hàng đợi an toàn theo chủ đề bao gồm các phụ thuộc theo thứ tự? Câu trả lời của bạn không có ý nghĩa nhiều. –

1

Phiên bản Visual Studio mới hơn có thể biên dịch các đơn vị dịch khác nhau song song. Nó sẽ giúp nếu dự án của bạn sử dụng nhiều tệp triển khai (chẳng hạn như .c, .cc, .cpp).

MSDN Page

+0

Phiên bản nào của trình biên dịch Visual C++ thực hiện điều này? Tôi không biết biên dịch song song trong một dự án đã được hỗ trợ. –

+2

giải pháp 'make -j N' giống như vậy, vì vậy đây không phải là câu trả lời – osgx

+0

VS hỗ trợ biên dịch song song 2008 và 2010. Kiểm tra liên kết. – watson1180

0

Không thực sự có thể xử lý nhiều giai đoạn liên kết. Có amy là một số mức độ đa luồng có thể nhưng nó không có khả năng cung cấp cho nhiều tăng hiệu suất. Như nhiều hệ thống xây dựng như vậy sẽ chỉ đơn giản là cháy ra một quá trình riêng biệt cho các tập tin riêng biệt. Một khi tất cả chúng được biên dịch thì nó sẽ, như bạn lưu ý, thực hiện một liên kết chuỗi đơn dài. Than ôi, như tôi nói, có rất ít điều quý giá bạn có thể làm về việc này: (

+0

Giai đoạn liên kết là khá nhỏ (về mặt thời gian) trong các dự án lớn, trong đó chế độ '-O3' hoặc thậm chí' -ipo' hoặc '-whole-program --combine' được sử dụng. – osgx

+0

Ví dụ: có một tập tin trong mysql, biên dịch trong đó có thể dài tới vài giờ với gcc. Đây là một trình phân tích cú pháp SQL, một tệp có kích thước 1 MB. Thời gian liên kết của nó là nhỏ, nhưng thời gian tối ưu hóa là rất lớn. – osgx

+1

IIRC trình liên kết được gửi kèm với trình biên dịch C/C++ của Digitalmars là đa luồng (và được viết bằng ASM!) Với hiệu ứng kết thúc là một trong những trình liên kết nhanh nhất trên thế giới. Nó có thể không cung cấp cho tốc độ tuyến tính nhưng nó cũng có thể cắt vài phút ra khỏi xây dựng lớn. – BCS

1

Biên dịch đa luồng không thực sự hữu ích như các hệ thống xây dựng (Make, Ninja) sẽ bắt đầu nhiều đơn vị biên dịch cùng một lúc Và như Ferrucio đã nói, đồng thời biên soạn là thực sự khó khăn để thực hiện.

Multithreaded liên kết mặc dù có thể có ích (.o đồng thời/.a đọc và biểu tượng độ phân giải.) vì điều này rất có thể sẽ được xây dựng cuối cùng bước.

Gnu Vàng mối liên kết có thể đa luồng, với triển khai LLVM ThinLTO: https://clang.llvm.org/docs/ThinLTO.html

+0

"Biên dịch đa luồng không thực sự hữu ích" - nó có thể rất hữu ích nếu thời gian biên dịch của bạn bị chi phối bởi một tệp C++ duy nhất (mà tôi đã trải qua nhiều lần cả với PMNM và dự án thương mại) hoặc khi bạn tăng dần sau khi thay đổi aa một tệp. Biên dịch song song đã được trong LLVM devmeetings để mọi người xem xét nó. – yugr

+0

"Trình liên kết Gnu Gold có thể được đa luồng" - lưu ý rằng [Giấy vàng] (https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/34417.pdf) tuyên bố rằng đã có không tăng tốc cho liên kết đa luồng. – yugr

+0

@yugr Cải thiện tốc độ lớn đến từ ThinLTO như tôi đã nói. Nhưng (tôi bỏ lỡ một vài tháng trước) tốc độ này chỉ hơn LTO không mỏng. – Salamandar

4

Gcc có -flto=n hoặc -flto=jobserver để thực hiện bước liên kết (với LTO tối ưu hóa và tạo mã) song song. Theo tài liệu, những tài liệu này đã có sẵn kể từ phiên bản 4.6, mặc dù tôi không chắc nó có hiệu quả như thế nào trong các phiên bản đầu tiên đó.

+0

Từ phiên bản nào? Nó được ghi chép ở đâu? Nếu đúng là [WHOPR! = LTO] (https://gcc.gnu.org/onlinedocs/gccint/LTO-Overview.html) và -flto có thể có kết quả tốt hơn (hoặc chỉ khác) so với -flto = n? – osgx

+1

@osgx Tôi đã thêm liên kết vào tài liệu. Tôi không biết nếu có bất kỳ sự khác biệt trong mã được tạo ra giữa '-flto' và' -flto = 42'. –

0

Go 1.9 biên dịch tuyên bố có:

Compilation Parallel

Trình biên dịch Go bây giờ hỗ trợ biên dịch các chức năng của một gói song song, lợi dụng đa lõi. Điều này là bổ sung cho sự hỗ trợ hiện tại của lệnh đi để biên dịch song song các gói riêng biệt.

nhưng tất nhiên, nó biên dịch Go, không phải C++

tôi không thể đặt tên bất kỳ trình biên dịch C++ làm tương tự như vậy, thậm chí vào tháng năm 2017. Nhưng tôi đoán rằng Go biên dịch đa luồng cho thấy đa trình biên dịch C hoặc C++ có luồng (về nguyên tắc) có thể. Nhưng họ là một vài trong số họ, và làm cho những cái mới là một huge work, và bạn thực tế sẽ cần phải bắt đầu một nỗ lực như vậy từ đầu.

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