Có bất kỳ hệ thống xây dựng nào kết hợp thời gian nhiệm vụ dự kiến ​​tương đối vào lịch trình không?


13

Đây là một minh họa nhỏ cho câu hỏi của tôi:

Giả sử một công việc xây dựng bao gồm 4 nhiệm vụ độc lập có tên AD. D mất nhiều thời gian hơn AC làm tổng.

Một hệ thống xây dựng không thể kết hợp thời gian tác vụ tương đối có thể lên lịch các tác vụ như thế này:

---------------------------------------
CPU1: A  |    C   |
---------------------------------------
CPU2: B    | D                        |
---------------------------------------

Ngược lại, nếu bộ lập lịch nhận thức được sự khác biệt về thời gian của nhiệm vụ, nó có thể đưa ra lịch trình ngắn hơn nhiều này:

---------------------------------------
CPU1: A  |  B    |   C   |
---------------------------------------
CPU2: D                        |
---------------------------------------

Những câu hỏi của tôi:

  1. Có bất kỳ hệ thống xây dựng nào kết hợp thời gian nhiệm vụ dự kiến ​​tương đối vào lịch trình không?
  2. Những nghiên cứu học thuật vào các hệ thống xây dựng loại này tồn tại?
  3. Những hệ thống xây dựng này (nếu chúng tồn tại) lấy thông tin thời gian từ đâu? Heuristic, thời gian thu thập trong các bản dựng trước?
  4. Nếu hệ thống xây dựng như vậy không tồn tại, tại sao? Có một gotcha sẽ làm cho họ ít giá trị hơn so với cái nhìn đầu tiên?

3
Hầu hết các câu hỏi cho tài nguyên hoặc công cụ của bên thứ ba được đóng lại nhanh chóng dưới dạng "ngoài chủ đề", nhưng tôi đoán đây có thể là một trường hợp cạnh có vẻ phù hợp với phạm vi của trang web này.
Doc Brown

1
Tôi nghĩ điều này dựa trên giả định sai lầm rằng "xây dựng" một nhiệm vụ là không song song.
dao găm

Trong hầu hết các trường hợp, việc xây dựng một tác vụ thực sự không song song, nhưng có, ví dụ, kiểm tra đơn vị trong các ứng dụng đa luồng thực sự có thể song song. Trên thực tế, trong một dự án nơi tôi làm việc, chúng tôi luôn phải gọi "make" với "-j1" để chạy thử nghiệm đơn vị, vì nếu không thì các thử nghiệm đơn vị đa lõi liên quan đến hiệu suất không thành công.
hát rong

@juhist Trong trường hợp bạn muốn chuyển sang một hệ thống xây dựng biểu cảm hơn, lắc có một khái niệm về tài nguyên , ví dụ bạn có thể xác định số lượng lõi CPU nên được dành riêng cho các bài kiểm tra đơn vị của bạn.
sjakobi

Câu trả lời:


3

Microsoft Visual Studio Team System (trước đây là TFS) xem xét thời gian hành động xây dựng và các bản dựng song song; nó lấy dữ liệu từ lịch sử xây dựng trước đó; và trong khi tôi không tin rằng bạn có thể loại bỏ hành vi bạn muốn ra khỏi hộp, bạn có thể tùy chỉnh nó.

Một ví dụ về một số tác vụ tùy chỉnh để tối ưu hóa hiệu suất

https://veegens.wordpress.com/2013/03/26/tfs-2010-build-performance-report/


Nếu tôi hiểu câu trả lời của bạn và liên kết của bạn một cách chính xác, thời gian hành động xây dựng được báo cáo (đó là tính năng khá phổ biến) nhưng không rõ liệu những thời gian này có thể được sử dụng để cải thiện lịch trình xây dựng hay không. Điều này dường như không thực sự trả lời (các) câu hỏi ban đầu của tôi, vì vậy tôi sẽ không trao phần thưởng cho câu trả lời của bạn.
sjakobi

Không có vấn đề, những gì bạn có thể đã bỏ lỡ là bạn có thể tùy chỉnh các hành động xây dựng và quá trình xây dựng, thông qua lập trình. Mẫu đã được báo cáo, nhưng như đã nêu, lịch sử được lấy để tối ưu hóa tự động. Ngoài ra, lưu ý rằng bạn có thể cấu hình các bản dựng song song. Nhưng sau đó để đảm bảo chúng được song song theo thuật toán của bạn, bạn có thể cần tùy chỉnh bằng mã. Một số tài liệu tham khảo bổ sung: dotnetcurry.com/visualstudio/1177/ từ
Bruno Guardia

2
@BrunoGuardia: bạn có thể giải thích vị trí trong bài viết liên kết của bạn là một tùy chọn tùy chỉnh được đề cập có thể giúp sử dụng thời gian tác vụ dự kiến ​​của các hành động xây dựng không?
Doc Brown

0

Điều này dựa trên giả định sai lầm rằng "xây dựng" một nhiệm vụ là không song song.

Nhiều trình biên dịch hoạt động đa luồng, do đó, một tác vụ A sẽ sử dụng tất cả các CPU. Do đó, thứ tự không quan trọng. Đối với các nhiệm vụ ràng buộc I / O, đặc biệt là liên quan đến kết nối mạng, tốt hơn hết hãy bắt đầu tất cả chúng ngay từ đầu: phần lớn thời gian sẽ được chờ đợi cho câu trả lời.

Nói cách khác, việc đặt hàng không thành vấn đề vì các tác vụ riêng lẻ thường được thực hiện song song (ví dụ như biên dịch)


Biên tập:

Trên thực tế, khái niệm "Nhiệm vụ A trên CPU 1" này cũng rất thiếu sót. Ngay cả đối với các tác vụ đơn luồng, HĐH lên lịch các quy trình / luồng có thể chuyển từ CPU sang CPU trên mỗi chuyển đổi ngữ cảnh. Tôi đoán hầu hết các hệ thống xây dựng sẽ chỉ chạy song song tất cả các tác vụ và để HĐH thực hiện lập lịch. Nhiệm vụ dài hơn sẽ mất nhiều thời gian hơn và đó là về nó.

Giả sử bạn có một tác vụ đơn luồng chạy dài mà không bị ràng buộc I / O , hệ thống xây dựng sẽ dễ dàng gán cho nó mức độ ưu tiên / mức độ quan trọng hơn là cố gắng trì hoãn các tác vụ nhỏ hơn để giảm chuyển đổi ngữ cảnh từ HĐH.

Ngay cả khi bạn có những nhiệm vụ kỳ lạ như vậy , điều này khá hiếm trong thực tế và có một hệ thống xây dựng lịch trình ưa thích hoạt động dựa trên các heuristic dựa trên các lần chạy trước (cách duy nhất để biết), những lợi ích bạn nhận được từ nó có thể khá nhỏ .. bất cứ khi nào bạn nhận được một loạt các phức tạp thêm để duy trì.


Tính song song "Trong nhiệm vụ" là một khía cạnh thú vị và chắc chắn mang lại tiềm năng tối ưu hóa bổ sung, nhưng tôi không nghĩ rằng giả sử rằng bất kỳ tác vụ nhất định nào sẽ mở rộng hiệu quả đến số lượng CPU tùy ý sẽ tốt hơn so với giả định rằng mỗi tác vụ phải chạy một lõi đơn.
sjakobi

@sjakobi: tốt, trong thực tế, điều khá quan trọng là trình biên dịch có hiệu quả. Bạn có thể tưởng tượng rằng bạn chờ đợi một thời gian dài để biên dịch vì chỉ có 1 trong số 16 lõi của bạn được sử dụng không? Đó là điều không nên. Với tất cả các lý thuyết bạn dường như bỏ qua thực tế. Lập kế hoạch là một chủ đề rất thú vị và rất có ý nghĩa. Nó chỉ là IMHO tương đối vô dụng trong bối cảnh xây dựng hệ thống. Một lần nữa, hầu hết các trình biên dịch ngày nay đều là đa luồng ... và nếu không, thì nỗ lực thay vào đó là hệ thống xây dựng lập lịch.
dagnelies

2
Tất cả các trình biên dịch phần mềm miễn phí ( GCC & Clang ...) cho C ++ hoặc C hoặc Fortran hoặc Ada đều được xử lý đơn luồng. Hệ thống xây dựng ( make -j) có thể khởi chạy song song một số quy trình biên dịch.
Basile Starynkevitch

@BasileStarynkevitch: ... thực sự. Về cơ bản, mọi người đều sử dụng -j <nb-cores>nhưng thật đáng buồn là mặc định vẫn là "1" ... Tôi vẫn ngạc nhiên khi nó không bao giờ thay đổi.
dagnelies

@dagnelies: Có một số lượng lớn các Makefile bỏ lỡ một số phụ thuộc quan trọng và do đó không hoạt động (hoặc có thể không hoạt động) với -jN trong đó N> 1.
juhist
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.