Các bài viết trên Wikipedia về EPIC đã vạch ra những nguy hiểm nhiều chung cho VLIW và EPIC.
Nếu bất cứ ai không nắm bắt được ý nghĩa của chủ nghĩa chí mạng từ bài viết đó, hãy để tôi nhấn mạnh điều này:
Tải các phản hồi từ hệ thống phân cấp bộ nhớ bao gồm bộ đệm CPU và DRAM không có độ trễ xác định.
Nói cách khác, bất kỳ thiết kế phần cứng nào không đối phó với (*) độ trễ không xác định từ truy cập bộ nhớ sẽ chỉ trở thành một thất bại ngoạn mục.
(*) Bằng cách "đối phó", cần phải đạt được hiệu suất thực thi hợp lý (nói cách khác là "cạnh tranh về chi phí"), điều này đòi hỏi không để CPU rơi vào tình trạng nhàn rỗi trong hàng chục đến hàng trăm chu kỳ thường xuyên.
Lưu ý rằng chiến lược đối phó được sử dụng bởi EPIC (được đề cập trong bài viết Wikipedia được liên kết ở trên) không thực sự giải quyết được vấn đề. Nó chỉ nói rằng gánh nặng biểu thị sự phụ thuộc dữ liệu giờ rơi vào trình biên dịch. Tốt rồi; trình biên dịch đã có thông tin đó, vì vậy thật đơn giản để trình biên dịch tuân thủ. Vấn đề là CPU vẫn không hoạt động trong hàng chục đến hàng trăm chu kỳ trên một truy cập bộ nhớ. Nói cách khác, nó bên ngoài một trách nhiệm phụ, trong khi vẫn không đối phó với trách nhiệm chính.
Câu hỏi có thể được đặt lại là: "Với một nền tảng phần cứng được coi là thất bại, tại sao (1) không (2) các nhà văn biên dịch có thể nỗ lực anh hùng để chuộc lại nó?"
Tôi hy vọng việc đọc lại của tôi sẽ làm cho câu trả lời cho câu hỏi đó rõ ràng.
Có một khía cạnh thứ hai của sự thất bại cũng gây tử vong.
Các chiến lược đối phó (được đề cập trong cùng một bài viết) giả định rằng việc tìm nạp trước dựa trên phần mềm có thể được sử dụng để khôi phục ít nhất một phần tổn thất hiệu năng do độ trễ không xác định từ truy cập bộ nhớ.
Trong thực tế, tìm nạp trước chỉ có lợi nhuận nếu bạn đang thực hiện các hoạt động phát trực tuyến (đọc bộ nhớ theo cách liên tục hoặc có thể dự đoán cao).
(Điều đó nói rằng, nếu mã của bạn giúp truy cập thường xuyên vào một số vùng nhớ cục bộ, bộ nhớ đệm sẽ giúp ích.)
Tuy nhiên, hầu hết các phần mềm đa năng phải thực hiện nhiều truy cập bộ nhớ ngẫu nhiên. Nếu chúng tôi xem xét các bước sau:
- Tính địa chỉ, và sau đó
- Đọc giá trị, và sau đó
- Sử dụng nó trong một số tính toán
Đối với hầu hết các phần mềm đa năng, ba phần mềm này phải được thực hiện liên tiếp. Nói cách khác, không phải lúc nào cũng có thể (trong giới hạn của logic phần mềm) để tính toán địa chỉ trước hoặc tìm đủ công việc cần làm để lấp đầy các gian hàng giữa ba bước này.
Để giúp giải thích lý do tại sao không phải lúc nào cũng có thể tìm đủ công việc để lấp đầy các quầy hàng, đây là cách người ta có thể hình dung nó.
- Giả sử, để ẩn hiệu quả các quầy hàng, chúng ta cần điền vào 100 hướng dẫn không phụ thuộc vào bộ nhớ (vì vậy sẽ không phải chịu độ trễ bổ sung).
- Bây giờ, với tư cách là một lập trình viên, vui lòng tải lên bất kỳ phần mềm nào bạn chọn vào trình dịch ngược. Chọn một hàm ngẫu nhiên để phân tích.
- Bạn có thể xác định bất cứ nơi nào một chuỗi gồm 100 hướng dẫn (*) không có quyền truy cập bộ nhớ không?
(*) Nếu chúng ta có thể thực NOP
hiện công việc hữu ích ...
Các CPU hiện đại cố gắng đối phó với điều tương tự bằng cách sử dụng thông tin động - bằng cách theo dõi đồng thời tiến trình của từng lệnh khi chúng lưu thông qua các đường ống. Như tôi đã đề cập ở trên, một phần của thông tin động đó là do độ trễ bộ nhớ không xác định, do đó nó không thể được dự đoán ở bất kỳ mức độ chính xác nào của trình biên dịch. Nói chung, đơn giản là không có đủ thông tin có sẵn tại thời điểm biên dịch để đưa ra quyết định có thể lấp đầy các quầy hàng đó.
Đáp lại câu trả lời của AProgrammer
Nó không phải là "trình biên dịch ... trích xuất song song là khó".
Sắp xếp lại bộ nhớ và hướng dẫn số học của các trình biên dịch hiện đại là bằng chứng cho thấy nó không có vấn đề gì trong việc xác định các hoạt động độc lập và do đó có thể thực hiện đồng thời.
Vấn đề chính là độ trễ bộ nhớ không xác định có nghĩa là bất kỳ "ghép lệnh" nào được mã hóa cho bộ xử lý VLIW / EPIC cuối cùng sẽ bị đình trệ khi truy cập bộ nhớ.
Tối ưu hóa các hướng dẫn không bị đình trệ (chỉ đăng ký, số học) sẽ không giúp ích cho các vấn đề về hiệu suất gây ra bởi các hướng dẫn rất có khả năng bị đình trệ (truy cập bộ nhớ).
Đó là một ví dụ về việc không áp dụng quy tắc tối ưu hóa 80-20: Tối ưu hóa những thứ đã nhanh sẽ không cải thiện hiệu suất tổng thể một cách có ý nghĩa, trừ khi những thứ chậm hơn cũng đang được tối ưu hóa.
Đáp lại câu trả lời của Basile Starynkevitch
Nó không phải là "... (bất cứ điều gì) là khó", đó là EPIC không phù hợp với bất kỳ nền tảng nào phải đối phó với tính năng động cao trong độ trễ.
Ví dụ: nếu bộ xử lý có tất cả những điều sau đây:
- Không truy cập bộ nhớ trực tiếp;
- Bất kỳ truy cập bộ nhớ (đọc hoặc ghi) phải được lên lịch bằng cách chuyển DMA;
- Mỗi hướng dẫn có độ trễ thực hiện như nhau;
- Thực hiện theo thứ tự;
- Đơn vị thực hiện rộng / véc tơ;
Sau đó, VLIW / EPIC sẽ phù hợp.
Trường hợp nào người ta tìm thấy bộ xử lý như vậy? DSP. Và đây là lúc VLIW phát triển mạnh mẽ.
Nhìn nhận lại, sự thất bại của Itanium (và tiếp tục đổ nỗ lực R & D vào một thất bại, mặc dù có bằng chứng rõ ràng) là một ví dụ về sự thất bại của tổ chức và xứng đáng được nghiên cứu sâu.
Cấp, các liên doanh khác của nhà cung cấp, chẳng hạn như siêu phân luồng, SIMD, vv, dường như rất thành công. Có thể việc đầu tư vào Itanium có thể đã có tác động phong phú đến các kỹ năng của các kỹ sư của họ, điều này có thể cho phép họ tạo ra thế hệ công nghệ thành công tiếp theo.