2012-01-17 51 views
18

Giả sử kiến ​​trúc đường ống 5 giai đoạn (IF = Lệnh tìm nạp, ID = Lệnh giải mã, EX = Thi hành, MEM = Truy cập bộ nhớ, WB = Đăng ký ghi lại) .Có 4 hướng dẫn phải được thực hiện.Khi xảy ra gián đoạn, điều gì xảy ra với hướng dẫn trong đường ống?

(Những hướng dẫn mẫu là không chính xác, nhưng tôi tin rằng điểm sẽ được hiểu)

Trong chu kỳ đồng hồ thứ năm, các hướng dẫn sẽ nằm trong đường ống như hình dưới đây.

Thêm a, b, c [NẾU ID EX MEM WB]

Thêm a, b, d [NẾU ID EX MEM]

Thêm a, b, e [NẾU ID EX]

Thêm a, b, f [IF ID]

Bây giờ nếu xảy ra sự cố phần cứng xảy ra với các hướng dẫn này. Liệu ngắt chỉ được xử lý sau khi tất cả các lệnh trong đường ống được thực hiện? Phần mềm sẽ ngắt và ngoại lệ được xử lý theo một cách khác?

+0

Các đường ống được xả nước theo cách tương tự như ví dụ: một chi nhánh chính xác - chi tiết chính xác phụ thuộc vào CPU bạn đang nói đến. –

+1

Tôi nghĩ thật đáng tiếc là câu hỏi đã được bỏ phiếu -1. Nó thực sự là một câu hỏi khá cơ bản trong kiến ​​trúc máy tính (vi mô), một câu thường bị hiểu lầm - như được thể hiện bằng câu trả lời đầu tiên bị lẫn lộn. –

Trả lời

16

Đầu tiên, thuật ngữ:

Thông thường, tại Intel ít nhất, ngắt là thứ gì đó đến từ thế giới bên ngoài. Thông thường, nó không được đồng bộ hóa với các lệnh thực hiện trên bộ xử lý, tức là nó là một ngắt ngoài không đồng bộ.

Trong thuật ngữ Intel, ngoại lệ là điều gì đó gây ra bởi các lệnh thực hiện trên bộ xử lý. Ví dụ. lỗi trang hoặc bẫy hướng dẫn không xác định.

--- + Ngắt tất cả các hướng dẫn trong chuyến bay

Trên mọi máy tôi quen thuộc - ví dụ: tất cả các bộ vi xử lý của Intel kể từ P5 (tôi làm việc trên P6), AMD x86, ARM, MIPS - khi tín hiệu ngắt được nhận các hướng dẫn trong đường ống gần như luôn luôn đỏ ửng, vứt đi.

Lý do duy nhất tôi nói "gần như luôn luôn" là trên một số máy này, bạn không phải lúc nào cũng ở nơi bạn được phép nhận gián đoạn. Vì vậy, bạn tiếp tục đến nơi tiếp theo, nơi một ngắt được cho phép - bất kỳ ranh giới hướng dẫn, thường - và THEN vứt bỏ tất cả các hướng dẫn trong đường ống.

Đối với vấn đề đó, các ngắt có thể bị chặn. Vì vậy, bạn tiến hành cho đến khi ngắt được bỏ chặn, và THEN bạn ném chúng đi.

Bây giờ, các máy này không chính xác là 5 đường ống dẫn theo giai đoạn đơn giản. Tuy nhiên, quan sát này - rằng hầu hết các máy móc vứt bỏ tất cả các lệnh trong đường ống, trong các đường ống trước đường ống nơi mà logic gián đoạn tồn tại - hầu như vẫn là sự thật.

Trong các máy đơn giản, logic ngắt thường sống ở giai đoạn cuối cùng của đường ống, WB, tương ứng gần với đường ống cam kết của các máy nâng cao. Đôi khi nó được chuyển lên một đường ống ngay trước đây, ví dụ: MEM trong ví dụ của bạn. Vì vậy, trên các máy như vậy, tất cả các hướng dẫn trong IF ID EX, và thường MEM, được vứt bỏ.

--- ++ Tại sao tôi quan tâm: Tránh Wasted làm việc

Chủ đề này là gần gũi với tôi bởi vì tôi đã đề xuất không làm điều này. Ví dụ. trong các chuyến thăm của khách hàng trong khi chúng tôi dự định xây dựng P6, tôi đã hỏi khách hàng họ ưa thích - độ trễ thấp hơn, hướng dẫn đang bay hoặc thông lượng cao hơn (hơi), cho phép ít nhất một số hướng dẫn bay hoàn thành chi phí của độ trễ hơi dài hơn.

Tuy nhiên, mặc dù một số khách hàng ưa thích thứ hai, chúng tôi đã chọn làm điều truyền thống, xả nước ngay lập tức. Ngoài độ trễ thấp hơn, lý do chính là độ phức tạp:

Ví dụ: nếu bạn mất một ngắt, nhưng nếu một trong những hướng dẫn đã có trong chuyến bay cũng có một ngoại lệ, sau khi bạn đã khôi phục IF (tìm nạp lệnh) nhưng trước khi bất kỳ lệnh trong ngắt đã cam kết, được ưu tiên? A: nó phụ thuộc. Và thứ đó là một nỗi đau để giải quyết.

--- +++ Folklore: OS Mainframe Interrupt trộn

này là khá giống như cách mà một số hệ điều hành máy tính lớn của IBM được báo cáo đã hoạt động:

  • với tất cả các ngắt chặn trong hoạt động bình thường ngoại trừ ngắt hẹn giờ;
  • trong gián đoạn hẹn giờ, bạn bỏ chặn ngắt và xử lý tất cả;
  • và sau đó quay trở lại hoạt động bình thường với ngắt chế độ chặn

Có thể hình dung họ chỉ có thể sử dụng một chế độ "ngắt trạm trộn" như vậy khi nhiều tải; nếu được tải nhẹ, chúng có thể không chặn các ngắt.

--- +++ Hoãn Máy Kiểm tra Exceptions

Ý tưởng trì hoãn ngắt để đưa ra hướng dẫn đã có trong đường ống một cơ hội để thực hiện cũng tương tự như những gì tôi gọi là thu nhập hoãn lại Máy Kiểm tra ngoại lệ - một khái niệm Tôi đã đưa vào Kiến trúc Kiểm tra Máy gia đình Intel P6 ban đầu, vào khoảng năm 1991-1996, nhưng dường như không được phát hành.Đây là lỗi chà xát: lỗi kiểm tra máy như (un) lỗi ECC có thể xảy ra SAU sau khi lệnh đã được gỡ bỏ (tức là sau khi các hướng dẫn được cho là nhỏ hơn, ví dụ như sổ đăng ký) hoặc TRƯỚC KHI lệnh đã ngừng hoạt động.

Ví dụ kinh điển về lỗi SAU là ECC không thể chỉnh sửa được kích hoạt bởi một cửa hàng được đặt vào bộ đệm ghi khi tốt nghiệp. Khá nhiều máy hiện đại làm điều này, tất cả các máy có TSO, có nghĩa là luôn có khả năng xảy ra lỗi kiểm tra máy không chính xác có thể chính xác nếu bạn quan tâm đủ để không lưu trữ bộ đệm.

Ví dụ điển hình về lỗi TRƯỚC KHI là ... tốt, mọi hướng dẫn, trên bất kỳ máy nào có đường ống. Nhưng thú vị hơn, các lỗi trên hướng dẫn sai đường dẫn, trong bóng tối của một sự hiểu sai chi nhánh.

Khi một hướng dẫn tải được một lỗi ECC không thể điều chỉnh, bạn có hai lựa chọn:

(1), bạn có thể kéo dây chuyền ngay lập tức, giết chết không chỉ là hướng dẫn trẻ hơn so với hướng dẫn tải mà còn bất kỳ hướng dẫn TRỞ LÊN

(2) hoặc bạn có thể viết một số loại mã trạng thái vào logic kiểm soát đầu cơ, và có ngoại lệ khi nghỉ hưu. Điều này là khá nhiều những gì bạn phải làm cho một lỗi trang, và nó làm cho các lỗi như vậy chính xác, giúp gỡ lỗi.

(3) Nhưng nếu lệnh tải có lỗi ECC không thể chỉnh sửa là hướng dẫn sai đường dẫn, và không bao giờ nghỉ hưu vì nhánh cũ hơn bị sai lệch và đi theo cách khác?

Vâng, bạn có thể viết trạng thái để cố gắng làm cho nó chính xác. Bạn nên có bộ đếm lỗi chính xác và lỗi không chính xác. Nếu không, bạn có thể bỏ qua một lỗi trên hướng dẫn sai đường dẫn - sau khi tất cả, nếu đó là một lỗi khó, nó sẽ bị chạm vào một lần nữa hoặc có thể không phải là./ Ví dụ: có thể là lỗi sẽ là im lặng về kiến ​​trúc - ví dụ: một dòng bộ nhớ cache xấu có thể bị ghi đè bởi một dòng bộ nhớ cache tốt cho cùng một địa chỉ.

Và nếu bạn thực sự muốn, bạn có thể thiết lập một chút để nếu một chi nhánh lớn hơn mispredicts, sau đó bạn có ngoại lệ kiểm tra máy tại thời điểm đó trong thời gian.

Lỗi như vậy sẽ không xảy ra tại bộ đếm chương trình được liên kết với hướng dẫn gây ra lỗi, nhưng vẫn có thể có trạng thái chính xác khác.

Tôi gọi (2) trì hoãn ngoại lệ kiểm tra máy; (3) chỉ là cách bạn có thể xử lý trì hoãn.

IIRC, tất cả ngoại lệ kiểm tra máy của Intel P6 đều không chính xác.

--- ++ Mặt hấp dẫn: thậm chí nhanh hơn

Vì vậy, chúng tôi đã thảo luận

0) lấy ngắt ngay lập tức, hoặc, nếu ngắt được chặn, thực hiện hướng dẫn và vi lệnh cho đến khi một ngắt đã đạt đến điểm cấm. Và sau đó xả tất cả các hướng dẫn trong chuyến bay.

1) cố gắng thực hiện các hướng dẫn trong đường ống, để tránh lãng phí công việc.

Nhưng có một khả năng thứ ba:

-1) nếu bạn có các điểm kiểm tra tình trạng vi kiến ​​trúc, đi ngắt ngay lập tức, không bao giờ chờ đợi đến một điểm cấm ngắt. Mà bạn chỉ có thể làm nếu bạn có một trạm kiểm soát của tất cả các nhà nước có liên quan tại "an toàn để có một ngắt" gần đây nhất.

Điều này thậm chí còn nhanh hơn 0), đó là lý do tại sao tôi gắn nhãn nó -1). Nhưng nó đòi hỏi các trạm kiểm soát, nhiều mà không phải tất cả các CPU tích cực đều sử dụng - ví dụ: Intel P6 dod không sử dụng trạm kiểm soát. Và các trạm kiểm soát sau khi nghỉ hưu này trở nên sôi nổi trong sự hiện diện của bộ nhớ chia sẻ - sau khi tất cả, bạn có thể thực hiện các hoạt động bộ nhớ như tải và lưu trữ trong khi các ngắt bị chặn. Và bạn thậm chí có thể giao tiếp giữa các CPU. Ngay cả bộ nhớ giao dịch phần cứng thường không làm điều đó.

--- + Exceptions đánh dấu các hướng dẫn bị ảnh hưởng

Ngược lại, trường hợp ngoại lệ, những thứ như lỗi trang, đánh dấu sự hướng dẫn bị ảnh hưởng.

Khi lệnh đó sắp cam kết, tại thời điểm đó tất cả các hướng dẫn sau sau khi ngoại lệ được xóa, và tìm nạp lệnh được chuyển hướng.

Có thể tưởng tượng, việc tìm nạp lệnh có thể được khôi phục trước đó, cách các lỗi giả định nhánh đã được xử lý trên hầu hết các bộ xử lý, tại thời điểm chúng tôi biết rằng ngoại lệ sẽ xảy ra. Tôi không biết ai làm điều này. Về khối lượng công việc hiện tại, ngoại lệ không quan trọng.

--- + "Phần mềm Ngắt"

"Phần mềm ngắt" là một hướng dẫn misnamed thường gắn liền với các cuộc gọi hệ thống.

Có thể hiểu được, một chỉ dẫn như vậy có thể được xử lý mà không làm gián đoạn đường ống, được dự đoán như một chi nhánh.

Tuy nhiên, tất cả các máy tôi quen thuộc với serialize theo một cách nào đó. Theo cách nói của tôi, họ không đổi tên cấp độ đặc quyền.

--- + "Ngắt chính xác", EMON, PEBS

Một áp phích khác đề cập đến ngắt chính xác.

Đây là một thuật ngữ lịch sử. Trên hầu hết các ngắt máy hiện đại được xác định là chính xác. Các máy cũ hơn với những gián đoạn không chính xác đã không thành công trên thị trường. Tuy nhiên, có một ý nghĩa thay thế, tôi đã tham gia giới thiệu: khi tôi có Intel để thêm khả năng tạo ra một gián đoạn trên tràn bộ đếm hiệu suất, đầu tiên sử dụng phần cứng bên ngoài, và sau đó bên trong CPU, nó được, trong vài thế hệ đầu tiên, hoàn toàn không chính xác.

Ví dụ: bạn có thể đặt bộ đếm để đếm số lượng hướng dẫn đã gỡ bỏ. Logic nghỉ hưu (RL) sẽ thấy các hướng dẫn về hưu, và báo hiệu mạch giám sát sự kiện hiệu suất (EMON). Có thể mất hai hoặc ba chu kỳ đồng hồ để gửi tín hiệu này từ RL đến EMON. EMON sẽ tăng bộ đếm, và sau đó thấy rằng có một tràn. Các tràn sẽ kích hoạt một yêu cầu gián đoạn đến APIC (Advanced Programmable Interrupt Controller). APIC có thể mất một vài chu kỳ để tìm hiểu điều gì đang xảy ra và sau đó báo hiệu logic nghỉ hưu.

I.e. EMON ngắt sẽ được báo hiệu không chính xác. Không phải tại thời điểm diễn ra sự kiện, nhưng một thời gian sau đó.

Tại sao sự thiếu chính xác này? Vâng, trong 1992-6, phần cứng đo lường hiệu suất không phải là một ưu tiên cao. Chúng tôi đã tận dụng phần cứng gián đoạn hiện có. Người ăn xin không thể chọn lựa.

Nhưng hơn nữa, một số hiệu suất thực chất không chính xác. Ví dụ. khi nào bạn báo hiệu một ngắt cho một bộ nhớ cache bỏ lỡ trên một hướng dẫn đầu cơ mà không bao giờ nghỉ hưu? (Tôi có một kế hoạch mà tôi gọi là sự kiện EMON hoãn lại, nhưng điều này vẫn được coi là quá đắt.) Đối với vấn đề đó, những gì về cache nhớ trên hướng dẫn cửa hàng, nơi cửa hàng được đặt vào một bộ đệm cửa hàng, và hướng dẫn đã nghỉ hưu?

I.e. đôi khi các sự kiện hiệu suất xảy ra sau khi lệnh được liên kết với đã cam kết (đã nghỉ hưu). Đôi khi trước đây. Và thường không chính xác theo hướng dẫn mà chúng có liên quan.

Nhưng trong tất cả các triển khai cho đến nay, theo như tôi biết, các sự kiện hiệu suất này được xử lý như ngắt: hướng dẫn hiện tại trong đường ống bị xóa.

Bây giờ, bạn có thể tạo sự kiện hiệu suất chính xác bằng cách xử lý nó như một cái bẫy. Ví dụ. nếu nó là một sự kiện như hướng dẫn về hưu, bạn có thể có bẫy logic nghỉ hưu ngay lập tức, thay vì dùng vòng lặp mạch mà tôi đã mô tả ở trên. Nếu nó xảy ra trước đó trong các đường ống, bạn có thể có một thực tế là nó xảy ra được đánh dấu trong tình trạng lỗi lệnh trong ROB (Re-Order Buffer). Một cái gì đó như thế này là những gì Intel đã thực hiện với PEBS (Lấy mẫu dựa trên sự kiện chính xác). http://software.intel.com/sites/products/collateral/hpc/vtune/performance_analysis_guide.pdf.

Tuy nhiên, lưu ý rằng không phải tất cả các sự kiện đều có thể được lấy mẫu bằng PEBS. Ví dụ, PEBS trong ví dụ trên có thể đếm số lần tải xuống bộ nhớ cache hoặc bỏ lỡ, nhưng không phải là các cửa hàng (vì các cửa hàng xuất hiện sau này).

Vì vậy, điều này cũng giống như trường hợp ngoại lệ: sự kiện chỉ được gửi khi lệnh ngừng hoạt động. Bởi vì trong một cảm giác sự kiện đã không hoàn toàn xảy ra - đó là một hướng dẫn tải, mà mất một bộ nhớ cache bỏ lỡ, và sau đó nghỉ hưu. Và hướng dẫn sau khi lệnh PEBS được đánh dấu bị xóa khỏi đường ống.

Tôi hy vọng --- + Bổ sung muộn về máy tính ban đầu

+0

Mức độ gián đoạn không đồng bộ sẽ khó khăn như thế nào để xác định rằng các hướng dẫn sẽ dừng bước vào đường ống, nhưng các đường dẫn trong đường dẫn sẽ chạy đến khi hoàn thành? Người ta có thể cần phải có hai dòng IRQ (một trong số đó sẽ yêu cầu tuôn ra đường ống) nhưng về mặt khái niệm thì có vẻ như nó phải đơn giản. – supercat

+1

Không có gì khó xây dựng *. * Xác minh *, để đảm bảo rằng bạn chưa phá vỡ điều gì đó, một số giả định ngầm định, là những gì cần có thời gian. Bởi vì chi phí xác minh cao và chi phí nhận sai có thể rất cao (nhớ lại, có thể là vụ kiện), các công ty (không chỉ các công ty phần cứng, mà là tất cả các công ty), có xu hướng khá thận trọng. Không đổi mới, trừ khi nhu cầu được thể hiện rất rõ ràng. IMHO quá bảo thủ, nhưng tôi hiểu sự ác cảm rủi ro. // Tôi đã đề cập đến những lỗi hiếm khi xảy ra trong một cái gì đó như gián đoạn là rất nhiều không thích? –

+0

Điều đó tạo ra rất nhiều ý nghĩa. Tôi đoán các bộ vi xử lý duy nhất có hành vi pipelining tôi đã kiểm tra trong bất kỳ chi tiết là những người đủ đơn giản mà tôi có thể hiểu chúng, và có thể tưởng tượng làm thế nào họ có thể được xác minh. Trên nhiều bộ vi xử lý phức tạp hơn, tất cả các tương tác đường ống dường như đủ phức tạp, tôi ngạc nhiên vì chúng hoạt động và tôi có thể thấy rằng việc thêm một biến khác vào hỗn hợp có thể làm phức tạp mọi thứ. Tuy nhiên, tôi đã thực hiện lập trình trên một chip có cả hướng dẫn chi nhánh bị trì hoãn và không trì hoãn và tôi thích các nhánh bị trì hoãn. Có lẽ họ đã thêm một số ... – supercat

1

Để ngắt quãng chính xác, các hướng dẫn trong chuyến bay trước khi giai đoạn IF chuyển sang chế độ nghỉ hưu ISR bình thường. Khi ISR ​​trả về, việc thực thi tiếp tục bắt đầu với lệnh kế tiếp sau lệnh rút lui cuối cùng của tiến trình gốc. Nói cách khác, ngắt chính xác luôn xảy ra giữa các hướng dẫn.

Xử lý các ngắt đồng bộ hơi khác một chút. Lấy x86 làm ví dụ, các ngoại lệ đồng bộ có ba mùi vị, bẫy, lỗi và hủy bỏ.

Một cái bẫy, như INT3, làm cho lõi đẩy hướng dẫn sau cái bẫy trên ngăn xếp, chẳng hạn khi ISR ​​trả về, lõi không reexecute hướng dẫn bẫy cùng một lúc.

Lỗi, giống như lỗi trang, làm cho lõi đẩy hướng dẫn lỗi trên ngăn xếp, chẳng hạn khi ISR ​​trả về, lõi sẽ xem xét lại hướng dẫn lỗi, có lẽ bây giờ trong trường hợp tránh cùng lỗi một lần nữa.

Hủy bỏ, giống như lỗi kép, là một vấn đề không thể khôi phục gây tử vong trong đó bộ xử lý không thể tiếp tục thực hiện tại nơi mà nó bị tắt.

Nội dung của khung ngăn xếp gián đoạn được đẩy bởi lõi trước khi vào ISR khác nhau tùy thuộc vào trường hợp bạn đang nói đến.

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