2013-04-25 71 views
12

Tôi đang đọc hướng dẫn nội tại của Intel trong khi triển khai hỗ trợ SIMD. Tôi có một vài nhầm lẫn và câu hỏi của tôi như sau.SIMD và sự khác biệt giữa độ chính xác kép được đóng gói và vô hướng

  1. __m128 _mm_cmpeq_ps (__m128 a, __m128 b) tài liệu nói rằng nó được sử dụng để so sánh các điểm nổi chính xác đóng gói. "Đóng gói" có nghĩa là gì? Tôi có cần gói các giá trị nổi của tôi bằng cách nào đó trước khi tôi có thể sử dụng chúng không?

  2. Đối với độ chính xác gấp đôi, có nội tại như _mm_cmpeq_sd có nghĩa là so sánh các phần tử dấu chấm động có độ chính xác gấp đôi "thấp hơn". Các elemtns có độ chính xác gấp đôi và trên có nghĩa là gì? Tôi có thể sử dụng chúng để so sánh vectơ của C++ double yếu tố loại hay không? Hay tôi cần phải xử lý chúng theo cách nào đó trước khi so sánh chúng?

Trả lời

14

Trong SSE, thanh ghi 128 bit có thể được biểu diễn dưới dạng 4 phần tử 32 bit.

SSE xác định hai loại hoạt động; vô hướng và đóng gói. Hoạt động vô hướng chỉ hoạt động trên phần tử dữ liệu ít quan trọng nhất (bit 0 ~ 31), và hoạt động đóng gói tính toán tất cả bốn phần tử song song.

_mm_cmpeq_sd sẽ chỉ so sánh phần tử dữ liệu ít quan trọng nhất (32 bit đầu tiên) của hai toán hạng trong khi _mm_cmpeq_ps sẽ so sánh từng nhóm 32 bit song song.

Nếu bạn đang sử dụng 64 bit đôi, bạn có thể gói đôi bằng cách ghép đôi để tận dụng không gian 128 bit. Bằng cách đó, _mm_cmpeq_ps sẽ có thể làm cho hai comparaison 4 đôi song song.

Nếu bạn chỉ muốn thực hiện một lần so sánh tại một thời điểm, bạn có thể sử dụng _mm_cmpeq_pd để so sánh hai 64 bit đôi.

Lưu ý rằng _mm_cmpeq_pd là SSE2 trong khi _mm_cmpeq_ps là SSE.

9

Trong ngữ cảnh này, "đóng gói" có nghĩa là "một số cùng loại được đưa vào một khối" nổi "đóng gói chính xác" có nghĩa là 4 * 32 bit số dấu chấm động được lưu trữ dưới dạng giá trị 128 bit.

Bạn cần phải "đóng gói" từng giá trị vào thanh ghi bằng cách sử dụng các hướng dẫn PACK* khác nhau hoặc có dữ liệu đã được "đóng gói" trong bộ nhớ, ví dụ: một mảng (bội số của) 4 giá trị dấu phẩy động [được căn chỉnh phù hợp].

Vô hướng có nghĩa là "một giá trị" ở số thấp hơn n bit của thanh ghi (ví dụ: double sẽ là 64 bit thấp của thanh ghi SSE 128 bit).