2013-06-09 84 views
8

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ủa RAX 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ào RSI.

Trả lời

6

CPU duy trì giả thuyết rằng chỉ có sổ đăng ký kiến ​​trúc (RAX, RBX, v.v ...) và có một chỉ dẫn cụ thể (IP). Lập trình viên và trình biên dịch nhắm vào tiểu thuyết này.

Tuy nhiên, như bạn đã lưu ý, các CPU hiện đại không thực thi serially hoặc theo thứ tự. Cho đến khi bạn lập trình/người dùng yêu cầu IP, nó giống như Vật lý lượng tử, IP là một làn sóng các lệnh được thực thi; tất cả để bộ vi xử lý có thể chạy chương trình càng nhanh càng tốt. Khi bạn yêu cầu IP hiện tại (ví dụ, thông qua một điểm ngắt trình gỡ rối hoặc ngắt profiler), thì bộ xử lý phải tạo lại hư cấu mà bạn mong đợi để nó sụp đổ dạng sóng này (tất cả các hướng dẫn "bay"), thu thập các giá trị đăng ký trở lại tên kiến ​​trúc và xây dựng bối cảnh để thực thi thường trình trình gỡ lỗi, v.v.

Trong ngữ cảnh này, có IP chỉ ra hướng dẫn nơi bộ xử lý sẽ tiếp tục thực hiện. Trong quá trình thực hiện không theo thứ tự, lệnh này là lệnh cũ nhất chưa hoàn thành, mặc dù tại thời điểm ngắt, bộ xử lý có thể đang tìm nạp hướng dẫn quá rõ ràng.

Ví dụ: có thể ngắt cho biết mov RSI, [RBX + RCX]; là IP, nhưng xor đã được thực thi và hoàn thành; tuy nhiên, khi bộ xử lý sẽ tiếp tục thực thi sau khi ngắt, nó sẽ thực thi lại xor.

+1

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

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