Trong cuốn sách Computer Systems: A Programmer Perspective, các Tập thể dục 5,5 cho thấy một đoạn mã để tính giá trị của một đa thứcXác định con đường quan trọng trong các dữ liệu chảy
double poly(double a[], double x, int degree)
{
long int i;
double result = a[0];
double xpwr = x;
for (i = 1; i <= degree; i++) {
result += a[i] * xpwr;
xpwr = x * xpwr;
}
return result;
}
Cuộc diễn tập giả định rằng các chu kỳ đồng hồ cần thiết cho phép cộng thêm dấu chấm động và phép nhân là 3 và 5 tương ứng. Người đọc được yêu cầu giải thích lý do tại sao CPE đo (Cycles Per Element) giá trị là 5.
Theo câu trả lời tập thể dục, trong mỗi lần lặp, chúng ta cần phải cập nhật các biến xpwr
và result
, và các hoạt động chúng ta cần là một bổ sung dấu chấm động (cho result
) và một phép nhân dấu phẩy động (cho xpwr
), do đó sau này chiếm ưu thế độ trễ, khiến CPE tối hậu là 5.
Nhưng tôi nghĩ luồng dữ liệu phải giống như này:
xpwr result
| |
+-----+ +--[load] |
| | | |
[mul] [mul] |
| | |
| +---+ +-----+
| | |
| [add]
| |
| +------+
| |
xpwr result
Vì vậy, đường dẫn dài nhất là từ giá trị trước đó của xpwr
đến giá trị mới của result
, đi qua các đơn vị thực hiện [mul]
và [add]
. Do đó thời gian dài nhất nên là 8 chu kỳ.
Tôi muốn hỏi
- gì chính xác là ý nghĩa của một con đường quan trọng? Và làm thế nào để xác định nó?
- Câu trả lời (mỏ và sách) nào hợp lý hơn?
Bất kỳ giải thích nào về CPU, kiến trúc, đơn vị thực thi, đường ống, đơn vị dấu chấm động sẽ được đánh giá cao.
'xpwr = x * xpwr;' là câu lệnh duy nhất không hoàn toàn độc lập trong các lần lặp lại, do đó, độ trễ 5 chu kỳ là điều ngăn máy tính xử lý nhanh hơn. Một trình biên dịch tốt sẽ có thể làm tốt hơn (ít nhất là cho mức độ cao hơn) bằng cách nhận ra rằng tính toán xpwr có thể được song song - ví dụ, tính x^2 trong lần lặp đầu tiên, x * x^2 và x^2 * x^2 (song song) trong lần thứ hai, x^3 * x^2 và x^4 * x^2 trong xpwr thứ ba, vv là một phần * tên * phụ thuộc. Cuốn sách có vẻ không chính xác. –