Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 75 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
75
Dung lượng
858,18 KB
Nội dung
ĐẠI HỌC QUỐC GIA TP.HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA @ & ? NGUYỄN THANH TÙNG GIẢI THUẬT ĐỊNH THỜI MÃ CHO KIẾN TRÚC PIPELINE Chun ngành: Khoa học máy tính LUẬN VĂN THẠC SĨ TP HỒ CHÍ MINH, tháng 12 năm 2008 1 Giới thiệu Bộ xử lý của máy tính là bộ não của máy tính, chúng ta muốn máy tính làm những cơng việc nào đó mà chúng ta cần thì chúng ta phải ra lệnh cho máy tính. Việc ra lệnh cho máy tính thực hiện theo các u cầu của chúng ta thơng qua việc lập trình. Bộ xử lý của các máy tính chỉ hiểu được các lệnh máy, hay cịn được gọi là ngơn ngữ máy, do đó những lập trình viên muốn lập trình trên các bộ xử lý này sẽ gặp rất nhiều khó khăn vì ngơn ngữ máy khơng gần với những ngơn ngữ tự nhiên. Để bộ xử lý của máy tính có thể hiểu được những chương trình được viết ở ngơn ngữ lập trình cấp cao (là những ngơn ngữ gần với ngơn ngữ tự nhiên) cần phải có một chương trình chuyển đổi ngơn ngữ cấp cao thành ngơn ngữ máy, đó là trình biên dịch. Trình biên dịch là phần mềm quan trọng, nó dùng để chuyển một ngơn ngữ lập trình cấp cao thành một ngơn ngữ lập trình cấp thấp hơn, giúp cho lập trình viên viết chương trình trên các ngơn ngữ gần với các ngơn ngữ trong cuộc sống đời thường mà máy tính vẫn có thể hiểu được. Trình biên dịch thực hiện cơng việc đọc một chương trình nguồn ở dạng ngơn ngữ cấp cao và dịch nó sang chương trình đích là ngơn ngữ máy tương ứng với bộ xử lý của máy tính được sử dụng. Trình biên dịch tốt là trình biên dịch sinh ra mã đối tượng tốt. Nếu trình biên dịch sinh ra mã đối tượng tốt thì chương trình sẽ thực thi nhanh hơn. Sinh mã đối tượng nằm ở giai đoạn cuối của trình biên dịch. Vấn đề sinh mã tối ưu trong trình biên dịch là khơng thể thực hiện được về mặt lý thuyết tổng qt, song trong thực tế ta có thể lựa chọn các kỹ thuật cụ thể để tạo ra được các mã đối tượng tốt mà khơng cần phải là mã tối ưu. Trong quá trình sinh mã đối tượng, để tạo ra được mã đối tượng tốt người ta phải thực hiện nhiều cơng đoạn và một trong những cơng đoạn đó là định thời mã đối tượng 2 Định thời mã đối tượng là cơng việc quan trọng và cần thiết trong giai đoạn sinh mã đối tượng của trình biên dịch. Bởi vì ngơn ngữ máy phụ thuộc vào kiến trúc của bộ xử lý, do đó vấn đề cần thiết là phải xây dựng một trình biên dịch phát sinh mã đối tượng phù hợp với kiến trúc bộ xử lý đó. Vì vậy cơng việc hốn đổi các câu lệnh của ngơn ngữ máy, sao cho tận dụng được những ưu điểm của bộ xử lý là cần thiết nhằm tăng tốc độ thực hiện của chương trình. Trong những máy tính hiện đại ngày nay, các bộ xử lý thường được sử dụng kiến trúc Pipeline tuyến tính. Việc xây dựng một trình biên dịch để tận dụng ưu điểm của kiến trúc Pipeline tuyến tính nhằm tăng tốc độ thực thi của chương trình là cần thiết. Bộ xử lý Pipeline tuyến tính là một dãy các bước xử lý, các bước này kết nối tuyến tính để thực hiện một chức năng cố định trên một dòng dữ liệu theo từng bước một. Để trình biên dịch sinh ra mã tốt thì trong q trình sinh mã đối tượng ta cần thực hiện cơng việc định thời mã đối tượng, sao cho giảm thiểu được càng nhiều interlock càng tốt (nghĩa là giảm thiểu các bước trì hỗn. Các bước trì hỗn của câu lệnh sinh ra vì phải đợi các kết quả của các câu lệnh trước đó). Để định thời mã, người ta thường chia quá trình định thời mã cho một chương trình thành hai giai đoạn. Giai đoạn một là phân rã chương trình thành những khối cơ bản và giai đoạn hai là thực hiện định thời lệnh trên khối cơ bản đó. Khối cơ bản là một dãy những câu lệnh liên tiếp, dãy các câu lệnh này có những dịng điều khiển đi vào tại vị trí bắt đầu và những dịng điều khiển đi ra tại vị trí kết thúc, những dịng điều khiển này khơng bị gián đoạn hoặc có thể chấp nhận rẽ nhánh tại vị trí cuối. Đề tài này đã đưa ra giải thuật List_cycle_scheduling thực hiện việc định thời mã cho một khối cơ bản. Giải thuật List_cycle_scheduling được cài đặt trong Trimaran3.7. Kết quả thử nghiệm của giải thuật List_cycle_scheduling cho ra kết quả là: Tổng số chu kỳ thực hiện của chương trình hiện thực bằng giải thuật List_cycle_scheduling so với các giải thuật do Trimaran cài đặt (như giải thuật Cycle_scheduling, Oper_scheduling, List_bt_scheduling) là gần bằng nhau và Thời 3 gian thực thi của giải thuật List_cycle_scheduling có những kết quả tốt hơn các giải thuật đó. Nội dung đề tài gồm năm chương. Chương 1: Một vài khái niệm cơ bản. Chương này nêu các khái niệm có liên quan đến nội dung của những giải thuật nêu ra trong đề tài. Chương 2: Một vài giải thuật định thời cục bộ. Chương này nêu ra một vài giải thuật định thời mã làm cơ sở để đưa ra giải thuật List_cycle_scheduling. Chương 3: Giải thuật List_cycle_scheduling. Trong chương này đưa ra giải thuật List_cycle_scheduling, ví dụ minh họa cho giải thuật này và phân tích độ phức tạp của giải thuật. Chương 4: Kết quả thử nghiệm của giài thuật List_cycle_scheduling. Trong chương này giới thiệu công cụ để hiện thực cho giải thuật này là Trimaran. Đưa ra các mẫu dữ liệu dùng để thử nghiệm cho giải thuật, Tổng số chu kỳ thực hiện trên các mẫu này và Thời gian thực thi của các giải thuật khi áp dụng cho các mẫu dữ liệu. So sánh kết quả của giải thuật List_cycle_scheduling với các giải thuật khác. Chương 5: Kết luận. Tổng kết các kết quả đạt được của đề tài và định hướng phát triển của đề tài PHỤ LỤC Giới thiệu 1 Chương 1. Một vài khái niệm cơ bản 4 1) Kiến trúc pipeline 4 2) Sự phụ thuộc giữa các câu lệnh 9 3) DDAG (The Dependency Directed Acyclic Graph) 10 4) Khối cơ bản (Basic block) 12 Chương 2. Một vài giải thuật định thời cục bộ 14 1) Giải thuật DLS (DelayedLoad Scheduling algorithm) 14 2) Giải thuật CSP (Code Scheduling for Pipelined processors): 21 3) Giải thuật ICS (Integrated Code Scheduling) 25 4) Giải thuật List_scheduling: 30 5) Giải thuật Cycle_scheduling: 33 6) Giải thuật Oper_scheduling: 37 7) Giải thuật List_BT_scheduling: 41 Chương 3. Giải thuật List_cycle_scheduling 47 1) Đặt vấn đề 47 2) Nội dung giải thuật 49 3) Ví dụ 53 4) Phân tích độ phức tạp của giải thuật 59 Chương 4. Kết quả thử nghiệm của giải thuật List_cycle_scheduling 61 1) Giới thiệu Trimaran 61 2) Hiện thực giải thuật List_cycle_scheduling 63 3) Tổng số chu kỳ thực hiện 64 4) Thời gian thực thi 65 5) Kết luận kết quả thử nghiệm 69 Chương 5. Kết luận 70 1 Tóm tắt Hiện nay, các bộ xử lý của máy tính thường sử dụng kiến trúc Pipeline nên việc xây dựng một trình biên dịch để tận dụng ưu điểm của kiến trúc Pipeline nhằm tăng tốc độ thực thi của chương trình là cần thiết. Định thời mã đối tượng là cơng việc quan trọng và cần thiết trong giai đoạn sinh mã đối tượng của trình biên dịch. Định thời mã thực hiện cơng việc định thời điểm thực thi của câu lệnh và hốn đổi các câu lệnh của ngơn ngữ máy, sao cho ý nghĩa của chương trình khơng thay đổi và làm tăng tốc độ thực hiện của chương trình. Định thời mã đối tượng có hai loại là: Định thời tồn cục và Định thời cục bộ. Đề tài này đã tìm hiểu một vài giải thuật định thời cục bộ và đưa ra giải thuật List_cycle_scheduling thực hiện việc định thời cục bộ cho một khối cơ bản 4 Chương 1 Một vài khái niệm cơ bản Trong chương này nêu ra một vài khái niệm sẽ được sử dụng khi trình bày các giải thuật định thời lệnh cho kiến trúc Pipeline. Mục đích của việc định thời lệnh là thay đổi trật tự của những câu lệnh và xác định thời điểm bắt đầu thực hiện câu lệnh, sao cho chúng có thể thực thi nhanh nhất nếu có thể và phù hợp với kiến trúc máy đích. Chương này trình bày các khái niệm như sau: Kiến trúc Pipeline, Sự phụ thuộc giữa các câu lệnh, Khối lệnh cơ bản, và đồ thị DDAG. 1) Kiến trúc Pipeline: Bộ xử lý Pipeline tuyến tính (Linear Pipeline Processors) là một dãy các bước xử lý, các bước này kết nối tuyến tính để thực hiện một chức năng cố định trên một dịng dữ liệu theo từng bước một. Trong những máy tính hiện đại ngày nay thì Pipeline tuyến tính được cài đặt cho việc thực thi lệnh, tính tốn số học, và hoạt động truy cập bộ nhớ [KH93]. Một bộ xử lý Pipeline tuyến tính được xây dựng với k bước xử lý. Dữ liệu ở bên ngồi đi vào Pipeline tại bước đầu tiên S 1 . Kết quả xử lý được đưa từ bước S i đến bước Si+1, với i=1, 2, …, k1. Kết quả cuối cùng được đưa ra khỏi Pipeline tại bước cuối cùng S k . Một dịng những câu lệnh có thể thực thi trên Pipeline theo kiểu Overlap (các lệnh gối lên nhau). Ví dụ như những Pipeline lệnh cho những bộ xử lý CISC và RISC. Việc thực thi lệnh là một dãy các hoạt động, bao gồm: bước đọc lệnh (fetch stage: F), bước giải mã lệnh (decode stage: D), bước chiếm giữ tài nguyên (issue 5 stage: I), bước thực thi lệnh (execute stage: E), bước ghi kết quả (writeback stage: W) · Bước đọc lệnh : là đọc lệnh từ bộ nhớ · Bước giải mã lệnh: giải mã lệnh để thực hiện và nhận diện những tài nguyên cần thiết. Những tài nguyên này bao gồm: các thanh ghi, các bus, và những đơn vị chức năng · Bước chiếm giữ tài nguyên: Giữ trước những tài nguyên (thanh ghi, bộ nhớ,…). Pipeline điều khiển những Interlock thì được duy trì tại bước này. Những dữ liệu vào từ bên ngồi thì cũng được đọc từ những thanh ghi trong khoảng thời gian này · Bước thực thi lệnh: Thực thi lệnh có một hoặc nhiều Bước thực thi lệnh. Ví dụ như ở hình 1.1.1 thì có ba Bước thực thi lệnh · Bước ghi kết quả: Ghi kết quả thực hiện lệnh vào những thanh ghi. Ví dụ: Một Pipeline lệnh được mơ tả như sau: (có bảy bước) Fetch Decode Issue Execute Execute Execute Writeback F D I E E E W (Hình 1.1.1: Một Pipeline lệnh có bảy bước) Ví dụ như ta có các câu lệnh trong ngơn ngữ cấp cao như sau: X=Y+Z; A=B*C; Ta viết lại các câu lệnh trên bằng ngơn ngữ cấp thấp như ở hình 1.1.2. Các câu lệnh của đoạn chương trình trên sẽ được thực thi trên cấu trúc Pipeline như sau: Câu lệnh 1 được thực hiện từ xung clock 1 đến xung clock 7. Tương tự, câu lệnh 2 được thực hiện từ xung clock 2 đến xung clock 8. Nhưng câu lệnh 3 thì được thực hiện từ xung clock 3 đến xung clock 12, và câu lệnh này bị interclock từ xung clock 5 đến xung clock 7; bởi vì câu lệnh này dùng kết quả thực thi từ câu lệnh 1 và câu lệnh 2 nên nó phải đợi cho đến khi câu lệnh 1 và câu lệnh 2 6 thực thi xong thì mới thực thi được. Tương tự, câu lệnh 4 được thực thi từ xung clock 4 đến xung clock 15, nó bị interclock từ xung clock 5 đến xung clock 7 (bởi vì nó đợi câu lệnh 3 thực hiện bước chiếm giữ tài ngun) và nó bị interlock từ xung clock 9 đến xung clock 10 (bởi vì nó phải đợi kết quả thực thi từ câu lệnh 3). Câu lệnh 5 được thực hiện từ xung clock 8 đến xung clock 16 và nó bị interlock từ xung clock 9 đến xung clock 10; bởi vì nó phải đợi cho câu lệnh 4 thực hiện bước chiếm giữ tài ngun thì nó mới thực hiện tiếp được. Câu lệnh 6 thực hiện từ xung clock 11 đến xung clock 17. Câu lệnh 7 được thực hiện từ xung clock 12 đến xung clock 20 và bị interlock từ xung clock 14 đến xung clock 15; Bởi vì nó phải đợi kết quả thực thi từ câu lệnh 5 và câu lệnh 6. Câu lệnh 8 được thực hiện từ xung clock 13 đến xung clock 23, nó bị interlock từ xung clock 14 đến xung clock 15 (bởi vì nó đợi câu lệnh 7 thực hiện bước chiếm giữ tài nguyên) và nó bị interlock từ xung clock 17 đến xung clock 18 (bởi vì nó đợi kết quả thực thi của câu lệnh 7). Kết quả được chỉ ra ở Hình 1.1.3. (1) Load R1, Y (2) Load R2, Z (3) Add R3, R1, R2 (4) Store X, R3 (5) Load R4, B (6) Load R5, C (7) Mul R6, R4, R5 (8) Store A, R6 (Hình 1.1.2:Đoạn lệnh chưa định thời) Vậy ta phải tốn 23 xung clocks để thực hiện đoạn lệnh trên; Nhưng ta lại bị interclock đến 9 xung clock. Vậy vấn đề đặt ra là ta có thể nào tối thiểu được số interclock khi thực thi chương trình mà khơng làm thay đổi tính đúng đắn của nó 57 đồ thị DDAG sau khi định thời nút 1. Nút 6 là nút đầu tiên trong danh sách op_list nên cm_op=6, giả sử phân phối được tài ngun cho nút cm_op thì sched_list={7, 5, 4, 2, 1, 6}. Nút 9 là nút ra của nút 6 nên ta tính trọng số cho nút 9 bằng 6 và giảm bậc vào của nút 9 đi 1. Khi đó danh sách op_list={8, 3}. Hình 4.3.6 là đồ thị DDAG sau khi định thời nút 6. 3 5 6 4 2 3 2 3 10 9 8 5 0 0 2 Op_list={6, 8, 3} Sched_list={7, 5, 4, 2, 1} 11 0 Hình 3.2.5 : Đồ thị DDAG sau khi định thời nút 1 3 5 3 2 3 10 9 8 5 6 0 2 11 0 Op_list={8, 3} Sched_list={7, 5, 4, 2, 1, 6} Hình 4.3.6 : Đồ thị DDAG sau khi định thời nút 6 58 Lấy nút cm_op=8 là nút đầu tiên trong danh sách op_list, giả sử khơng phân phối được tài ngun cho nút cm_op thì tăng trọng số cho nút 8 lên 1, nghĩa là nút 8 có trọng số bằng 6. Khi đó op_list={3, 8}. Lấy cm_op=3 là nút đầu tiên trong danh sách op_list, giả sử khơng phân phối được tài ngun cho nút cm_op thì tăng trọng số cho nút 3 lên 1, nghĩa là nút 3 có trọng số bằng 6. Khi đó op_list={8, 3}. Hình 4.3.7 là đồ thị DDAG khi khơng định thời được nút 8 và nút 3. 3 6 3 2 3 10 9 8 6 6 0 2 11 0 Op_list={8, 3} Sched_list={7, 5, 4, 2, 1, 6} Hình 4.3.7: Đồ thị DDAG khi khơng định thời được nút 8 và nút 3 Nút 8 là nút đầu tiên trong danh sách op_list nên cm_op=8, giả sử phân phối được tài ngun cho nút cm_op thì sched_list={7, 5, 4, 2, 1, 6, 8}. Nút 9 là nút ra của nút 8 nên ta tính trọng số cho nút 9 bằng 8 và giảm bậc vào của nút 9 đi 1, lúc đó bậc vào của nút 9 bằng 0. Khi đó danh sách op_list={3, 9}. Hình 4.3.8 là đồ thị DDAG sau khi định thời nút 8. Lấy nút đầu tiên trong danh sách op_list là cm_op=3, giả sử phân phối được tài ngun cho nút cm_op thì sched_list={7, 5, 4, 2, 1, 6, 8, 3}. Nút 10 là nút ra của nút 3 nên ta tính trọng số cho nút 10 bằng 9 và giảm bậc vào cho nút 10 đi 1, lúc đó nút 10 có bậc vào bằng 1. Khi đó danh sách op_list={9}. Hình 4.3.9 là đồ thị DDAG sau khi định thời nút 3. 59 3 6 3 3 10 9 8 0 2 Op_list={3, 9} Sched_list={7, 5, 4, 2, 1, 6, 8} 11 0 Hình 4.3.8 : Đồ thị DDAG sau khi định thời nút 8 3 10 9 8 9 2 11 0 Op_list={9} Sched_list={7, 5, 4, 2, 1, 6, 8, 3} Hình 4.3.9 : Đồ thị DDAG sau khi định thời nút 3 Thực hiện tương tự, ta có được kết quả định thời là: sched_list={7, 5, 4, 2, 1, 6, 8, 3, 9, 10, 11} Để xác định thời gian dịch của giải thuật List_cycle_scheduling, ta thực hiện tính độ phức tạp của giải thuật đó. 4) Phân tích độ phức tạp giải thuật: Giả sử đồ thị phụ thuộc DDAG có n đỉnh. Để xác định độ phức tạp của giải thuật ta cần xác định độ phức tạp của các câu lệnh (1), (2), (3), (4) và (5). 60 Các câu lệnh (2), (3) và (4) có độ phức tạp là O(1). Câu lệnh (1) có độ phức tạp là O(n 2 ). Câu lệnh (5.2.2.3.1) và (5.2.5) có độ phức tạp bằng O(n). Do đó câu lệnh (5.2.2.3) có độ phức tạp bằng O(n). Câu lệnh (5.2.2.1) và (5.2.2.2) có độ phức tạp là O(1). Vậy câu lệnh (5.2.2) có độ phức tạp là O(n 2 ). Câu lệnh (5.2.1) có độ phức tạp là O(n). Các câu lệnh (5.2.3), (5.2.4) và (5.2.6) có độ phức tạp là O(1). Vậy câu lệnh (5.2) có độ phức tạp là O(n 2 ). Ta thấy câu lệnh (5.1) có độ phức tạp là O(1), do đó câu lệnh (5) có độ phức tạp là O(n 3 ). Kết luận: độ phức tạp của giải thuật List_cycle_scheduling là O(n 3 ). Tương tự, Giải thuật List_scheduling và Cycle_scheduling cũng có độ phức tạp là O(n 3 ). Vậy các giải thuật List_scheduling, Cycle_scheduling và List_cycle_scheduling có độ phức tạp đều bằng nhau và bằng O(n 3 ). Như vậy để thấy được ưu điểm của giải thuật List_cycle_scheduling so với các giải thuật List_scheduling và Cycle_scheduling ta thực hiện công việc hiện thực giải thuật này 61 Chương 4 Kết quả thử nghiệm của giải thuật List_cycle_scheduling Trong chương 3 đã trình bày giải thuật List_cycle_scheduling, do đó để thấy được hiệu quả của giải thuật ta thực hiện cài đặt giải thuật này. Giải thuật List_cycle_scheduling thực hiện định thời lệnh cho kiến trúc Pipeline. Cơng việc định thời này là tối ưu kết quả dịch trong trình biên dịch trên bộ xử lý có sử dụng kiến trúc Pipeline. Do đó ta cần một cơng cụ hỗ trợ cho việc tối ưu trình biên dịch cho bộ xử lý đó và Trimaran là một phần mềm đáp ứng được các u cầu đó. Để xác định hiệu quả của giải thuật List_cycle_scheduling, đề tài dựa vào hai thành phần là: Tổng số chu kỳ thực hiện của chương trình, và thời gian thực thi của giải thuật. Kết quả của giải thuật List_cycle_scheduling được so sánh với các giải thuật đã được hiện thực trong Trimaran là: List_scheduling, Cycle_scheduling, Oper_scheduling, và List_bt_scheduling. Vì vậy, chương này có các thành phần sau: Giới thiệu Trimaran, Hiện thực giải thuật List_cycle_scheduling, Tổng số chu kỳ thực hiện của chương trình, Thời gian thực thi của giải thuật, và Kết luận kết quả thử nghiệm. Sau đây là phần giới thiệu về Trimaran. 1) Giới thiệu Trimaran: Giải thuật List_cycle_scheduling được hiện thực trong Trimaran3.7 và trên hệ điều hành Linux (phiên bản Fedora core 6). Trimaran là sự kết hợp của trình biên dịch và mô phỏng, giúp hỗ trợ cho việc nghiên cứu kiến trúc máy tính và tối ưu trình biên dịch. Trimaran có thể thực hiện trên những bộ xử lý nhúng (Embedded 62 Processors), bộ xử lý VLIW (Very Long Instruction Word), và kiến trúc nhiều clusters (MultiClustered Architectures). Trimaran có thực hiện định thời lệnh trên kiến trúc Pipeline, và các giải thuật định thời trên khối cơ bản là: List_scheduling, Cycle_scheduling, Oper_scheduling và List_bt_scheduling [Trimaran]. Trimaran gồm có ba thành phần: trình biên dịch IMPACT, trình biên dịch ELCOR, và mơ phỏng SIMU. Trimaran dùng IMPACT để biên dịch mã nguồn gốc thành mã hợp ngữ trung gian gọi là LCode. Mã này được đưa qua trình biên dịch ELCOR, Elcor dựa vào máy đích MDES (Machine Description) để tạo ra mã trung gian khác gọi là REBEL. Mã trung gian REBEL được đưa vào mơ phỏng SIMU, và mơ phỏng SIMU dựa vào máy đích MDES để phát sinh ra mã thực thi. Hình 4.1 là sơ đồ khối của Trimaran. Chương trình nguồn C MDES IMPACT ELCOR Lcore IR Rebel IR SIMU Hình 4.1: Sơ đồ khối của Trimaran Các cơng việc định thời mã và phân phối thanh ghi được thực hiện trong phần ELCOR. Trình biên dịch Elcor là trình biên dịch VLIW, nó phát sinh ra mã hợp ngữ độc lập với máy, biên dịch và tối ưu mã hợp ngữ này cho máy đặc biệt MDES. Đầu vào của elcor là mã trung gian Lcode và đầu ra của nó là ngơn ngữ trung gian Rebel. Cụ thể: các giải thuật định thời trên khối cơ bản được cài đặt trong các phần sau: · Chương trình chính của elcor nằm trong các file el_main (đường dẫn 63 elcor/src/main) · Khởi tạo các giá trị ban đầu cho các giải thuật định thời trên khối cơ bản nằm trong các file scalar_sched và priority (đường dẫn elcor/src/sched) · Các giải thuật định thời trên khối cơ bản được hiện thực trong các file schedule (đường dẫn elcor/src/sched). Vậy việc cài đặt giải thuật List_cycle_scheduling cũng phải được chứa trong những file đó. Cụ thể được thể hiện ở mục 2). 2) Hiện thực giải thuật List_cycle_scheduling: Tên mẫu Giải thích Bmm Khởi tạo ma trận, nhân hai ma trận, tính tổng các phần tử trong ma trận. (Sử dụng cấp phát tỉnh) Exp Hàm tính e x và chương trình tính tổng (1+e 1 +e 2 +e 3 +…) Fib Tính phần tử thứ n trong dãy fibonacci (dùng lệnh lặp) Fib_recur Tính phần tử thứ n trong dãy fibonacci. (dùng đệ qui) Mm_dyn Khởi tạo ma trận, nhân hai ma trận, tính tổng các phần tử trong ma trận. (Sử dụng cấp phát động) Queen Bài toán 8 quân hậu. Strcpy Sao chép chuỗi. switch_test Sử dụng câu lệnh switch. test_install Xây dựng các hàm thư viện và sử dụng các hàm thư viện. type_test Sử dụng các kiểu dữ liệu struct, union, enum,…. Hình 4.2: Ý nghĩa của các chương trình mẫu Theo như kết quả của mục 1) thì việc hiện thực giải thuật List_cycle_scheduling được thực hiện trong Elcor cụ thể như sau: 64 · Xây dựng các lớp Ttuple, Tlist trong các file tlist (đường dẫn elcor/src/tools) · Xây dựng lớp Dep_pri_my trong các file priority (đường dẫn elcor/src/sched) · Chèn đoạn lệnh dùng để khởi tạo các giá trị ban đầu cho giải thuật list_cycle_scheduling trong các file scalar_sched (đường dẫn elcor/src/sched) · Chèn đoạn lệnh để thực hiện giải thuật list_cycle_scheduling trong các file schedule (đường dẫn elcor/src/sched). Kết quả đánh giá giải thuật List_cycle_scheduling dựa vào hai yếu tố là: Tổng số chu kỳ thực hiện của giải thuật và Thời gian thực thi của giải thuật đó. Tổng số chu kỳ thực hiện của giải thuật dựa vào kết quả mơ phỏng trong Trimaran (file PD_STATS). Kết quả này được xác định dựa trên các mẫu chương trình thử nghiệm cụ thể. Hình 4.2.1 giải thích ý nghĩa của từng mẫu thử nghiệm sẽ được dùng để thử nghiệm cho giải thuật. 3) Tổng số chu kỳ thực hiện: Đề tài chạy các giải thuật dựa theo các mẫu dữ liệu được nêu ra ở hình 4.2. Tổng số chu kỳ thực hiện của các chương trình trên các giải thuật được thể hiện ở hình 4.3. Theo kết quả có được ở hình 4.3, ta thấy: các giải thuật List_cycle_scheduling, Cycle_scheduling, List_bt_scheduling và Oper_scheduling có tổng số chu kỳ thực hiện bằng nhau, trừ mẫu type_test thì giải thuật List_cycle_scheduling có tổng số chu kỳ thực hiện lớn hơn các giải thuật Cycle_scheduling, List_bt_scheduling, và Oper_scheduling. Trong khi đó giải thuật List_scheduling có tổng số chu kỳ thực hiện lớn hơn các giải thuật còn lại. Kết quả đánh giá của giải thuật List_cycle_scheduling còn dựa vào thời gian thực thi của giải thuật 65 Tên mẫu List_cycle Cycle List List_bt Oper Bmm 41460 41460 41614 41460 41460 Exp 21007 21007 21009 21007 21007 Fib 173 173 177 173 173 fib_recur 188823 188823 263920 188823 188823 mm_dyn 59160 59160 59175 59160 59160 Queen 1581942 1581942 1581956 1581942 1581942 Strcpy 18088 18088 18094 18088 18088 switch_test 20255 20255 20289 20255 20255 test_install 750703 750703 750713 750703 750703 type_test 6727 6594 6856 6594 6594 Hình 4.3: Tổng số chu kỳ của các chương trình mẫu tương ứng với từng giải thuật. 4) Thời gian thực thi: Thời gian thực thi của các chương trình mẫu được áp dụng trên các giải thuật được thể hiện ở hình 4.4.1. Kết quả này được thực hiện trên các mẫu dữ liệu cho năm giải thuật List_cycle_scheduling, Cycle_scheduling, List_scheduling, List_bt_scheduling, và Oper_scheduling. Mỗi mẫu chạy 10 lần và lấy kết quả trung bình của thời gian thực thi của mỗi giải thuật (đơn vị tính là micro giây), sau đó: tính tỷ lệ phần trăm giữa giải thuật List_cycle_scheduling với các giải thuật Cycle_scheduling, List_scheduling, List_bt_scheduling, Oper_scheduling. Dựa theo kết quả của hình 4.4.1 thì giải thuật List_scheduling có thời gian thực thi nhanh nhất và giải thuật Cycle_scheduling có thời gian thực thi chậm nhất. Giải thuật List_cycle_scheduling có thời gian thực thi nhỏ hơn hoặc bằng thời gian thực thi của các giải thuật Cycle_scheduling, List_bt_scheduling và Oper_scheduling. Ngoại trừ mẫu type_test giải thuật List_cycle_scheduling có thời gian thực thi lớn hơn thời gian thực thi của giải thuật List_bt_scheduling 66 Tên mẫu List_cycle Cycle List List_bt Oper Bmm 89046 106293 86824 91518 96593 Exp 10434 11850 10365 11371 11065 Fib 12539 14211 12869 12598 13928 fib_recur 15192 17050 15284 15561 15662 mm_dyn 34975 44170 33920 35898 38249 Queen 51560 57507 50954 53455 54196 Strcpy 9450 11000 9535 10480 10016 switch_test 111662 130367 107980 114152 120910 test_install 17129 19383 17114 18185 17692 type_test 200578 545501 170263 186444 240821 hình 4.4.1: Thời gian thực thi (đơn vị tính micro giây) của các giải thuật trên bộ xử lý Core Duo, bộ nhớ 1GB. 120000 12000 100000 11500 80000 11000 pe r O Li st t_ bt Li s Li st _C yc l e r pe O st st _ Li Li le yc C cy bt 9500 10000 0 cl e 20000 Li st _ Exp 10500 e 40000 yc l Bmm C 60000 Hình 4.4.2.1: Quan hệ của thời gian thực thi Hình 4.4.2.2: Quan hệ của thời gian thực thi cho mẫu bmm tương ứng với các giải thuật cho mẫu exp tương ứng với các giải thuật 67 13000 Fib 12500 12000 yc le C yc le pe r t t_ c Li Li s Li O st _b Li st yc le C st _ cy cl e 11500 fib_re cur t t_ bt O pe r 13500 17500 17000 16500 16000 15500 15000 14500 14000 Li s 14000 Li s 14500 Hình 4.4.2.3: Quan hệ của thời gian thực thi Hình 4.4.2.4: Quan hệ của thời gian thực thi cho mẫu fib tương ứng với các giải thuật cho mẫu fib_recur tương ứng với các giải thuật 40000 30000 mm _dyn 10000 Li s Li st e yc le Li s t_ c yc l t_ bt O pe r Li st Li s Li st _c yc le C yc le 0 Q ue en C 20000 58000 56000 54000 52000 50000 48000 46000 t_ bt O pe r 50000 Hình 4.4.2.5: Quan hệ của thời gian thực thi Hình 4.4.2.6: Quan hệ của thời gian thực thi cho mẫu mm_dyn tương ứng với các giải cho mẫu queen tương ứng với các giải thuật thuật Li s t_ bt O pe r switch_test Li st yc le C yc le O pe r t t_ b Li s Li st e yc l C Li st _c yc l e S trcpy 140000 120000 100000 80000 60000 40000 20000 0 Li st _c 11500 11000 10500 10000 9500 9000 8500 Hình 4.4.2.7: Quan hệ của thời gian thực thi Hình 4.4.2.8: Quan hệ của thời gian thực thi cho mẫu strcpy tương ứng với các giải thuật cho mẫu switch_test tương ứng với các giải thuật 68 Li st _c Li st Li st _b t O pe r type_test yc l Li s Li t st _b t O pe r yc le C yc le test_in stall Li s t_ c 600000 500000 400000 300000 200000 100000 0 e C yc le 20000 19500 19000 18500 18000 17500 17000 16500 16000 15500 Hình 4.4.2.9: Quan hệ của thời gian thực thi Hình 4.4.2.10: Quan hệ của thời gian thực thi cho mẫu test_install tương ứng với các giải cho mẫu type_test tương ứng với các giải thuật thuật Tên mẫu Cycle List List_bt Oper Bmm 83.77% 102.56% 97.30% 92.19% Exp 88.05% 100.67% 91.76% 94.30% Fib 88.23% 97.44% 99.53% 90.03% fib_recur 89.10% 99.40% 97.63% 97.00% mm_dyn 79.18% 103.11% 97.43% 91.44% Queen 89.66% 101.19% 96.45% 95.14% Strcpy 85.91% 99.11% 90.17% 94.35% switch_test 85.65% 103.41% 97.82% 92.35% test_install 88.37% 100.09% 94.19% 96.82% type_test 36.77% 117.80% 107.58% 83.29% hình 4.4.3: Tỷ lệ phần trăm thời gian thực thi của giải thuật list_cycle với các giải thuật cycle, list, list_bt, và oper trên bộ xử lý Core Duo, bộ nhớ 1GB. Để so sánh thời gian thực thi của giải thuật List_cycle_scheduling với các giải 69 thuật Cycle_scheduling, List_scheduling, List_bt_scheduling, và Oper_scheduling đề tài thực hiện hai cơng việc: Cơng việc thứ nhất là vẽ các đồ thị. Các hình 4.4.2.X (với X=1 10) là các đồ thị chỉ ra mối quan hệ của thời gian thực thi của các giải thuật List_cycle_scheduling, Cycle_scheduling, List_scheduling, List_bt_scheduling, và Oper_scheduling trên các mẫu dữ liệu tương ứng. Công việc thứ hai là tỷ lệ phần trăm thời gian thực thi của giải thuật List_cycle_scheduling so với các giải thuật Cycle_scheduling, List_scheduling, List_bt_scheduling, và Oper_scheduling. Các kết quả này được thể hiện ở Hình 4.4.3. 5) Kết luận kết quả thử nghiệm: Theo các kết quả thử nghiệm ở trên, giải thuật List_cycle_scheduling có tổng số chu kỳ thực hiện bằng với các giải thuật Cycle_scheduling, List_bt_scheduling, và Oper_scheduling. Nhưng thời gian thực thi của giải thuật List_cycle_scheduling nhanh hơn hoặc bằng các giải thuật đó. Giải thuật List_cycle_scheduling có tổng số chu kỳ thực hiện nhỏ hơn giải thuật List_scheduling, tuy nó thời gian thực thi lớn hơn giải thuật list_scheduling. Đối với mẫu type_test thì kết quả của giải thuật List_cycle_scheduling khơng được khả quan. Ta biết rằng: mẫu type_test hiện thực các kiểu dữ liệu có trong chương trình. Do đó giải thuật List_cycle_scheduling phù hợp với các chương trình mà khơng khai báo q nhiều kiểu dữ liệu, và rất phù hợp đối với các chương trình có khối lượng phép tính lớn 70 Chương 5 Kết luận Giải thuật List_cycle_scheduling thực hiện định thời mã cho khối cơ bản trong các bộ xử lý có xử dụng kiến trúc Pipeline. Giải thuật List_cycle_scheduling dựa vào đồ thị phụ thuộc DDAG để chỉ ra sự phụ thuộc giữa các câu lệnh trong khối cơ bản. Sau đó dùng đồ thị phụ thuộc DDAG để xác định bậc vào của các nút trong đồ thị và trọng số của các nút. Mỗi nút trong đồ thị là một câu lệnh trong ngơn ngữ đích và Trọng số nút là thời điểm sớm nhất có thể định thời cho nút đó. Trong Trimaran có bốn giải thuật thực hiện việc định thời trên khối cơ bản, đó là các giải thuật: List_scheduling, Cycle_scheduling, Oper_scheduling và List_bt_scheduling. Trong đó giải thuật List_scheduling có thời gian thực thi là nhanh nhất, nhưng tổng số chu kỳ thực hiện của chương trình sử dụng giải thuật này thì khơng tốt bằng các giải thuật Cycle_scheduling, Oper_scheduling và List_bt_scheduling. Còn các giải thuật Cycle_scheduling, Oper_scheduling và List_bt_scheduling thì cho ra chương trình thực thi có tổng số chu kỳ tính tốn gần bằng nhau. Giải thuật List_cycle_scheduling có tổng số chu kỳ thực hiện trên các mẫu dữ liệu thì gần bằng với các giải thuật Cycle_scheduling, Oper_scheduling và List_bt_scheduling, nhưng có thời gian thực thi phần lớn là nhanh hơn các giải thuật này. Riêng với các mẫu type_test thì giải thuật List_cycle_scheduling có thời gian thực thi khơng tốt bằng giải thuật List_bt_scheduling. Trong đề tài này khơng đưa ra giải thuật để hốn đổi các câu lệnh trong các khối cơ bản. Nếu ta đưa ra được các giải thuật để hốn đổi các câu lệnh trong các khối cơ bản tốt thì kết quả của chương trình dịch sẽ tốt hơn. Đây là hướng mở trong đề tài này nhằm xây dựng những giải thuật kết hợp việc hốn đổi các câu lệnh trong các khối cơ bản và định thời lệnh trên những khối cơ bản đó Tài liệu tham khảo [GWC88] J.R.Goodman and WeiChung.Hsu, “Code scheduling and Register Allocation in Large basic Blocks”, In Proceedings of the International Conference on Supercomputing, pages 442452, St. Malo, France, July 1988. [GM86] Phillip B.Gibbons and Steven S.Muchnick, “Efficient Instruction Scheduling for a Pipelined Architecture”, Proceedings of the SIGPLAN’86 Symposium on Compiler Construction, Jun 1986. [TC91] A.P.Todd and N.F.Charles, “Lineartime Optimal Code Scheduling for DelayedLoad Architectures”, Proceedings of the ACM SIGPLAN’91 Conference on Programming Language Design and Implementation, Toronto, Ontario, Canada, June 2628, 1991. [KKF95] A.Koseki, H.Komatsu and Y.Fukazawa, “A Global Code Scheduling Technique Using Guarded PDG”, IEEE First International Conference on, Volume 2, Issue, 1921 Apr 1995 P661p669. [KH93] Kai Hwang, “Advanced computer architecture: Parallelism, Scalability, Programmability”, p265p281, McGrawHill, Inc, 1993. [HG83] John Hennessy and Thomas Gross, “Postpass code Optimization of pipeline constraints”, ACM Transactions on Programming Languages and Systems, p422p448, Volume 5, Issue 3, July 1983. [JF81] Joseph A. Fisher and student member, Trace Scheduling: A Technique for Global Microcode Compaction, IEEE Transactions on computers, Vol. C30, No. 7, July 1981. [ALSU07] A.V.Aho, M.S.Lam, R.Sethi and J.D.Ullman, “Compilers Principles, Techniques, & Tools”, Addison Wesley, 2007. [Trimaran] www.trimaran.org ... dụng cho? ? kiến? ? trúc? ? Pipeline, bao gồm: Giải? ? thuật? ? DLS, Giải? ? thuật? ? CSP, Giải? ? thuật? ? ICS, Giải? ? thuật? ? List_scheduling, Giải? ? thuật? ? Cycle_scheduling,? ?Giải? ?thuật? ?Oper_scheduling, và? ?Giải? ?thuật? ?List_bt_scheduling. ... Vậy việc? ?định? ?thời? ?lệnh? ?cho? ?chương trình có hai dạng là? ?định? ?thời? ?tồn cục và định? ? thời? ? cục bộ. Định? ? thời? ? toàn cục là định? ? thời? ? lệnh cho? ? toàn bộ chương trình. Định? ? thời? ? cục bộ ... quan đến nội dung của những? ?giải? ?thuật? ?nêu ra trong đề tài. Chương 2: Một vài? ?giải? ?thuật? ?định? ?thời? ?cục bộ. Chương này nêu ra một vài giải? ?thuật định? ?thời? ?mã? ?làm cơ sở để đưa ra? ?giải? ?thuật? ?List_cycle_scheduling.