Có lệnh SSE2 nào để tải đăng ký véc tơ 128 bit int
từ bộ đệm int
theo thứ tự ngược lại không?Lệnh SSE2 để tải các số nguyên theo thứ tự ngược
Trả lời
Đó là khá dễ dàng để đảo ngược 32 bit int
yếu tố sau một tải bình thường:
__m128i v = _mm_load_si128(buff); // MOVDQA
v = _mm_shuffle_epi32(v, _MM_SHUFFLE(0, 1, 2, 3)); // PSHUFD - mask = 00 01 10 11 = 0x1b
Bạn có thể làm điều tương tự cho 16 bit short
yếu tố, nhưng phải mất nhiều hướng dẫn:
__m128i v = _mm_load_si128(buff); // MOVDQA
v = _mm_shuffle_epi32(v, _MM_SHUFFLE(0, 1, 2, 3)); // PSHUFD - mask = 00 01 10 11 = 0x1b
v = _mm_shufflelo_epi16(v, _MM_SHUFFLE(2, 3, 0, 1)); // PSHUFLW - mask = 10 11 00 01 = 0xb1
v = _mm_shufflehi_epi16(v, _MM_SHUFFLE(2, 3, 0, 1)); // PSHUFHW - mask = 10 11 00 01 = 0xb1
Lưu ý rằng bạn có thể thực hiện việc này với ít hướng dẫn hơn bằng cách sử dụng _mm_shuffle_epi8
(PSHUFB
), nếu SSSE3 có sẵn:
const __m128i vm = _mm_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1);
// initialise vector mask for use with PSHUFB
// NB: do this once, outside any processing loop
...
__m128i v = _mm_load_si128(buff); // MOVDQA
v = _mm_shuffle_epi8(v, vm); // PSHUFB
EDIT: (Sau đây là cho vô hướng điểm chính xác duy nhất nổi, để lại nó ở đây chỉ trong trường hợp)
Các xấp xỉ nhất (và tiện dụng) là _mm_loadr_ps
nội tại. Hãy nhận biết địa chỉ phải được liên kết 16byte.
Mặc dù nội tại này dịch sang số nhiều hơn chỉ dẫn (MOVAPS
+ xáo trộn).
Cảm ơn bạn đã trả lời nhưng hướng dẫn này tải bốn giá trị độ chính xác, dấu phẩy động theo thứ tự ngược. Tôi đang tìm kiếm phép toán tương tự cho số nguyên nhưng tôi đoán không có hỗ trợ cho điều đó. – Andy
Có, tôi không nhận thấy bạn đang nói về các giá trị số nguyên (nên đọc lại tiêu đề của bạn). Paul R câu trả lời là những gì bạn cần. – Trax
Có.Chỉ cần tò mò, có thể thực hiện cùng một thao tác với giá trị ngắn không? – Andy
Cảm ơn Paul.Giao diện của bạn đang hoạt động tốt.Nhưng tôi không thể hiểu việc sử dụng tham số thứ hai "0x1B". Có một số loại mặt nạ? Một nghi ngờ khác là .. Có thể thực hiện thao tác tương tự trên quần short không? – Andy
Tôi đã thêm một ví dụ thứ hai để tải và đảo ngược quần short. Mặt nạ được bao phủ trong các tài liệu của Intel nhưng tôi đã thêm các bình luận để hiển thị nó được xây dựng như thế nào. –
P.S. Tôi rất khuyên bạn nên tải xuống [Hướng dẫn nội tại của Intel] (http://software.intel.com/en-us/articles/intel-intrinsics-guide) - một công cụ rất hữu ích cho WIN/Mac OS X/Linux có tài liệu tất cả Hướng dẫn và bản chất SSE/AVX theo cách rất dễ tiếp cận. –