Giải thuật định thời mã cho kiến trúc pipeline

75 45 0
Giải thuật định thời mã cho kiến trúc pipeline

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

ĐẠ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  Trimaran­3.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 (Delayed­Load 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, …, k­1. 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 Trimaran­3.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 (Multi­Clustered 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  Wei­Chung.Hsu,  “Code  scheduling  and  Register  Allocation  in  Large  basic  Blocks”,  In  Proceedings  of  the  International  Conference on Supercomputing, pages 442­452, 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,  “Linear­time  Optimal  Code  Scheduling  for  Delayed­Load  Architectures”,  Proceedings  of  the  ACM  SIGPLAN’91  Conference  on  Programming  Language  Design  and  Implementation,  Toronto, Ontario, Canada, June 26­28, 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, 19­21 Apr 1995 P661­p669.  [KH93]  Kai  Hwang,  “Advanced  computer  architecture:  Parallelism,  Scalability, Programmability”, p265­p281, McGrawHill, Inc, 1993.  [HG83]  John  Hennessy  and  Thomas  Gross,  “Postpass  code  Optimization  of  pipeline  constraints”,  ACM  Transactions  on  Programming  Languages  and  Systems, p422­p448, 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. C­30, 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. 

Ngày đăng: 16/02/2021, 18:45

Tài liệu cùng người dùng

Tài liệu liên quan