Khi mã định hình ở cấp hướng dẫn lắp ráp, vị trí của con trỏ lệnh thực sự có ý nghĩa gì khi các CPU hiện đại không thực hiện các lệnh theo trình tự hoặc theo thứ tự? Ví dụ: giả sử mã lắp ráp x64 sau:Hướng dẫn cấp hồ sơ: Ý nghĩa của con trỏ chỉ dẫn?
mov RAX, [RBX]; // Assume a cache miss here.
mov RSI, [RBX + RCX]; // Another cache miss.
xor R8, R8;
add RDX, RAX; // Dependent on the load into RAX.
add RDI, RSI; // Dependent on the load into RSI.
Hướng dẫn nào sẽ sử dụng phần lớn thời gian? Tôi có thể nghĩ ra các đối số tốt cho tất cả chúng:
mov RAX, [RBX]
có lẽ là 100 chu kỳ vì đó là lỗi bộ nhớ cache.mov RSI, [RBX + RCX]
cũng mất 100 chu kỳ, nhưng có thể thực thi song song với lệnh trước đó. Nó có nghĩa là gì đối với con trỏ hướng dẫn trên một hay cái kia?xor R8, R8
có thể thực hiện không đúng thứ tự và kết thúc trước khi bộ nhớ tải xong, nhưng con trỏ có thể ở lại đây cho đến khi tất cả các lệnh trước đó cũng được hoàn tất.add RDX, RAX
tạo gian hàng đường ống vì đó là hướng dẫn trong đó giá trị củaRAX
thực sự được sử dụng sau khi tải chậm bộ nhớ cache-chậm vào đó.add RDI, RSI
cũng có các quầy hàng vì nó phụ thuộc vào tải trọng vàoRSI
.
Bạn có thể giải thích cách bộ theo dõi hoạt động phần cứng hoạt động trong ngữ cảnh đó không? Ví dụ. Linux có hệ thống con 'perf' cung cấp lược tả thống kê dựa trên PMC. Là hạt nhân chỉ tạo ra một tần số cao gián đoạn mà sau đó sẽ - theo tương tự của bạn rất tốt đẹp - sụp đổ chức năng sóng IP và đọc ra các PMCs, và sau đó sẽ gán các giá trị hiện tại của PMCs đó cho IP hiện đang tìm thấy (sau khi sóng chức năng sụp đổ)? Và sau đó đặt lại các PMC và tiếp tục từ ngắt? – oberstet