2013-03-10 36 views
7

AMD64 Kiến trúc Programmer của tay Tập 1: Application Programming trang 226 nói về các chỉ lệnh SSE:x64 SSE kiểu dữ liệu

Bộ xử lý không kiểm tra kiểu dữ liệu của toán hạng hướng dẫn trước khi hướng dẫn thực hiện. Nó chỉ kiểm tra chúng tại thời điểm thực hiện. Ví dụ, nếu bộ xử lý thực thi một số học chỉ dẫn các toán hạng có độ chính xác kép nhưng được cung cấp với các toán hạng đơn chính xác theo hướng dẫn MOV1, . và kết quả sẽ chính xác. Tuy nhiên, việc chuyển đổi bắt buộc có thể làm giảm hiệu suất.

Tôi không hiểu điều này; Tôi có thể nghĩ rằng các thanh ghi ymm chỉ chứa 256 bit mà mỗi lệnh diễn giải theo các toán hạng dự kiến ​​của nó, tùy thuộc vào bạn để đảm bảo đúng loại, và trong kịch bản được mô tả, CPU sẽ chạy ở tốc độ tối đa và âm thầm cho câu trả lời sai.

Tôi đang thiếu gì?

+1

Có lẽ chúng đề cập đến thực tế là nếu bạn sử dụng 'movaps' để tải gấp đôi, nó hoạt động ra sao? Có một chút kỳ lạ khi nói theo cách họ đã làm, đặc biệt là vì không có chuyển đổi, nhưng tôi không thấy những gì khác họ có thể có nghĩa là .. – harold

Trả lời

1

Các Intel® 64 and IA-32 Architectures Optimization Reference Manual § 5.1 cho biết một cái gì đó tương tự về trộn nguyên/FP "kiểu dữ liệu" (nhưng tò mò không đơn và đôi):

Khi viết mã SIMD mà làm việc cho cả dữ liệu dấu chấm động số nguyên và, sử dụng tập con của hướng dẫn chuyển đổi SIMD hoặc hướng dẫn tải/lưu trữ để đảm bảo rằng toán hạng đầu vào trong sổ đăng ký XMM chứa các kiểu dữ liệu được xác định đúng để khớp lệnh.

Các chuỗi mã chứa cách sử dụng nhập chéo tạo ra kết quả tương tự trên các triển khai khác nhau nhưng phải chịu một hình phạt hiệu suất đáng kể. Sử dụng các hướng dẫn sử dụng SSE/SSE2/SSE3/SSSE3/SSE44.1 để hoạt động trên loại dữ liệu loại không phù hợp trong thanh ghi XMM được khuyến khích mạnh mẽ.

Các Intel® 64 and IA-32 Architectures Software Developer’s Manual là simularly khó hiểu:

SSE và SSE2 phần mở rộng xác định hoạt động trên các kiểu dữ liệu dấu chấm động đóng gói và vô hướng và trên 128-bit SIMD loại nguyên liệu đánh máy, nhưng IA-32 bộ vi xử lý không thực thi việc gõ này ở cấp kiến ​​trúc. Họ chỉ thi hành nó ở cấp vi mô.

...

Pentium 4 và Intel Xeon xử lý thực hiện các hướng dẫn mà không phát sinh hợp lệ-operand ngoại lệ (#UD) và sẽ tạo ra kết quả mong đợi trong sổ đăng ký XMM0 (có nghĩa là, cao và thấp 64 -bản sao của mỗi thanh ghi sẽ được coi là giá trị dấu phẩy động kép chính xác và bộ xử lý sẽ hoạt động trên chúng tương ứng).

...

Trong ví dụ này: XORPS hoặc PXOR có thể được sử dụng thay cho XORPD và mang lại kết quả đúng như vậy.Tuy nhiên, do loại không phù hợp giữa loại dữ liệu toán hạng và loại dữ liệu lệnh, một hình phạt trễ sẽ được phát sinh do việc triển khai các hướng dẫn ở cấp vi kiến ​​trúc.

Hình phạt trễ cũng có thể phát sinh bằng cách sử dụng hướng dẫn di chuyển của loại sai. Ví dụ, MOVAPS và MOVAPD cả hai có thể được sử dụng để di chuyển một toán hạng đơn chính xác được đóng gói từ bộ nhớ đến thanh ghi XMM. Tuy nhiên, nếu MOVAPD được sử dụng, hình phạt trễ sẽ được phát sinh khi lệnh được nhập chính xác cố gắng sử dụng dữ liệu trong thanh ghi.

Lưu ý rằng các hình phạt trễ này không phát sinh khi di chuyển dữ liệu từ đăng ký XMM sang bộ nhớ.

tôi thực sự không có ý tưởng những gì nó có nghĩa là bởi "họ chỉ thực thi nó ở cấp độ microarchitectural" ngoại trừ việc nó cho thấy "các kiểu dữ liệu" khác nhau được đối xử khác biệt bởi μ vòm. Tôi có một vài dự đoán:

  • AIUI, x86 lõi thường sử dụng register renaming do thiếu đăng ký. Có lẽ họ sử dụng nội bộ các thanh ghi khác nhau cho các toán hạng nguyên/đơn/kép để chúng có thể được đặt gần các đơn vị vector tương ứng. Có vẻ như các số FP được thể hiện trong nội bộ bằng cách sử dụng một định dạng khác (ví dụ: sử dụng số mũ lớn hơn để loại bỏ các ký hiệu) và chuyển thành các bit chuẩn khi cần thiết.
  • CPU sử dụng "forwarding" hoặc "bỏ qua" để các đơn vị thực thi không phải chờ dữ liệu được ghi vào sổ đăng ký trước khi có thể sử dụng chỉ dẫn sau, thường là lưu một hoặc hai chu kỳ. Điều này có thể không xảy ra giữa các đơn vị số nguyên và FP.
+0

Theo câu trả lời cho http://stackoverflow.com/questions/6678073/ sự khác biệt giữa movdqa-và-movaps-x86-hướng dẫn có vẻ như điều này là chính xác. – rwallace

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