2010-01-06 16 views
20

Giả sử chúng tôi muốn biên dịch một dự án lớn (nói GCC hoặc hạt nhân Linux) càng nhanh càng tốt. Có một CPU với khả năng siêu phân luồng (nói Intel Core i7) chạy trình biên dịch nhanh hơn với tính năng siêu phân luồng được bật hoặc tắt không? Có bất kỳ điểm chuẩn được xuất bản nào để kiểm tra điều này không?Tác động của siêu phân luồng lên hiệu năng biên dịch?

Sự hiểu biết của tôi về siêu phân luồng là mỗi lõi có thể chọn hướng dẫn từ hai (hoặc nhiều quy trình). Điều này thường làm cho lõi hiệu quả hơn vì ít khả năng các đơn vị chức năng sẽ không hoạt động. Tuy nhiên, có tiềm năng cho một hình phạt hiệu suất vì các quá trình chạy trên cùng một tài nguyên chia sẻ cốt lõi như bộ nhớ cache và có thể gây trở ngại cho nhau. Hiệu suất có thực sự tăng hay không phụ thuộc vào khối lượng công việc.

Vì vậy, đối với khối lượng công việc của trình biên dịch, hiệu suất có tăng không? Nếu có thì bao nhiêu?

+0

Tôi không có kinh nghiệm gần đây về điều này, nhưng không biên dịch có xu hướng bị I/O ràng buộc? – Ken

+0

Chơi với "make -j N" và đo lường tài nguyên hệ thống cho các N khác nhau? –

+0

@Nikolai, tôi sẽ làm như vậy nếu tôi có một CPU được phát triển mạnh. Tôi yêu cầu điều này vì vậy tôi biết liệu mua một là đáng giá. –

Trả lời

26

coreutils-8.4 Biên soạn trên Ubuntu 8.04 x86

Intel Atom 1,6 GHz với HT được kích hoạt:

~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make > /dev/null 

real 2m33.375s 
user 2m22.873s 
sys  0m10.541s 
~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make -j2 > /dev/null 

real 1m54.707s 
user 3m26.121s 
sys  0m13.821s 
~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make > /dev/null 

real 2m33.372s 
user 2m22.753s 
sys  0m10.657s 
~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make -j2 > /dev/null 

real 1m54.851s 
user 3m26.145s 
sys  0m13.685s 
~/coreutils-8.4$ 

Vì vậy, Hyper-Threading làm giảm thời gian chạy đến 75%, tương đương với 33% nhiều công suất xử lý. (Tôi chạy họ hai lần để đảm bảo rằng mọi thứ đều trong bộ nhớ cache.)

Và đây là một thí nghiệm kiểm soát để chứng minh rằng make -j2 một mình không cải thiện tốc độ cho biên soạn coreutils-8.4 trên Ubuntu 8.04 x86

Độc thân lõi Core 2 Quad 2,5 GHz (không có HT):

~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make > /dev/null 

real 0m44.453s 
user 0m38.870s 
sys  0m5.500s 
~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make -j2 > /dev/null 

real 0m45.131s 
user 0m40.450s 
sys  0m4.580s 
~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make > /dev/null 

real 0m44.621s 
user 0m39.090s 
sys  0m5.340s 
~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make -j2 > /dev/null 

real 0m45.165s 
user 0m40.390s 
sys  0m4.610s 
~/coreutils-8.4$ 
+0

Điều này là rất tốt. Thử nghiệm kiểm soát cho thấy điều này thực sự tạo ra sự khác biệt. Cảm ơn bạn. –

+2

Tôi có thể thích nhìn thấy các phép đo lặp đi lặp lại trên Atom với HT bị vô hiệu hóa, giả định rằng có thể thực hiện. Ngoài ra, một lưu ý về việc sử dụng bộ nhớ sẽ tốt đẹp, vì Atom có ​​thể bắt đầu trao đổi hoặc xóa cache, đặc biệt trong trường hợp -j2. – Eroen

+0

Atom theo thứ tự tồi tệ hơn khi khai thác tính song song mức lệnh so với CPU Nehalem hoặc Sandybridge-gia đình, hoặc AMD Ryzen. HT có thể giúp ích nhiều hơn cho Atom so với CPU chủ đạo.Hoặc nó có thể giúp đỡ ít hơn, bởi vì các CPU chính thống có bộ nhớ cache lớn hơn và nhiều tài nguyên thực thi hơn (và các hình phạt chi nhánh cao hơn, và HT cho phép chủ đề khác sử dụng CPU trong khi một người đang phục hồi từ một suy đoán sai). Vì vậy, có lẽ HT giúp đáng kể trên các CPU chính thống, quá, nhưng tỷ lệ có thể khá khác nhau. –

0

Tất cả phụ thuộc vào nếu trình biên dịch được viết thành đa luồng hay không. Nếu nó là, sau đó chắc chắn siêu phân luồng tốc độ điều lên một chút kể từ đó hệ điều hành có thể lên lịch các phần khác nhau của các trình biên dịch của chủ đề vào lõi khác nhau. Tôi đồng ý với Ken rằng biên dịch nói chung có nhiều I/O bị ràng buộc hơn là xử lý chuyên sâu, vì vậy có một ổ đĩa cứng nhanh chóng sẽ cần thiết hơn một bộ vi xử lý nhanh với 100 lõi.

+0

Làm thế nào về nếu trình biên dịch được gọi với make -j N (N là số lượng bộ xử lý logic)? Tôi lo ngại rằng vì các quá trình biên dịch riêng biệt không chia sẻ bất kỳ dữ liệu nào, chúng thực sự làm giảm hiệu suất. –

+2

1) Biên soạn (trên Linux anyway) luôn luôn có thể được thực hiện không bị ràng buộc, cung cấp đủ bộ nhớ vật lý có mặt. 2) Các hệ thống xây dựng phổ biến có thể gọi nhiều quá trình biên dịch song song, làm cho các trình biên dịch đa luồng không thành vấn đề. (ít hơn cho các liên kết, mặc dù) – Eroen