我有我正在分配的兩項SSE整數如下:洗牌註冊
__m128i m1 = _mm_set_epi32(4,3,2,1);
__m128i m2 = _mm_set_epi32(40,30,20,10);
現在,我要做的這兩個寄存器之間的一些洗牌,並把結果保存在另外兩個寄存器,從而輸出如下:
m3 = (30,3,10,1);
m4 = (40,4,20,2);
有什麼辦法可以實現這個!
感謝
我有我正在分配的兩項SSE整數如下:洗牌註冊
__m128i m1 = _mm_set_epi32(4,3,2,1);
__m128i m2 = _mm_set_epi32(40,30,20,10);
現在,我要做的這兩個寄存器之間的一些洗牌,並把結果保存在另外兩個寄存器,從而輸出如下:
m3 = (30,3,10,1);
m4 = (40,4,20,2);
有什麼辦法可以實現這個!
感謝
可以是這樣做的:
t1 = _mm_shuffle_epi32(m1, 0xd8);
t2 = _mm_shuffle_epi32(m2, 0xd8);
m4 = _mm_unpackhi_epi32(t1,t2);
m3 = _mm_unpacklo_epi32(t1,t2);
下面是一個完整的例子
#include <x86intrin.h>
#include <stdio.h>
int main() {
__m128i m1 = _mm_set_epi32(4,3,2,1);
__m128i m2 = _mm_set_epi32(40,30,20,10);
__m128i m3, m4, t1, t2;
t1 = _mm_shuffle_epi32(m1, 0xd8);
t2 = _mm_shuffle_epi32(m2, 0xd8);
m4 = _mm_unpackhi_epi32(t1,t2);
m3 = _mm_unpacklo_epi32(t1,t2);
int out3[4], out4[4];
_mm_store_si128((__m128i*)out3, m3);
_mm_store_si128((__m128i*)out4, m4);
printf("%d %d %d %d\n", out3[3], out3[2], out3[1], out3[0]);
printf("%d %d %d %d\n", out4[3], out4[2], out4[1], out4[0]);
}
輸出
30 3 10 1
40 4 20 2
你讓我的一天...非常感謝你 – 2014-09-25 23:55:52
BTW 0xd8 = 3120在base-4(和二進制11011000)。這告訴你我正在交換的數字。我知道base-4不是典型的思維方式,但在這種情況下很方便。 – 2014-09-26 07:52:54
我想出了一個稍微不同的Z Boson解決方案:
#include <emmintrin.h>
#include <iostream>
#include <cstring>
void print_data(const char *name, __m128i v)
{
struct { int a, b, c, d; } unpacked;
std::memcpy((void *)&unpacked, (void *)&v, sizeof(v));
std::cout << name << ":";
std::cout << unpacked.d << " " << unpacked.c << " "
<< unpacked.b << " " << unpacked.a << std::endl;
}
int main()
{
__m128i m1 = _mm_set_epi32(4,3,2,1);
__m128i m2 = _mm_set_epi32(40,30,20,10);
__m128i mask = _mm_set_epi32(-1,0,-1,0);
/*
m3 = (30,3,10,1);
m4 = (40,4,20,2);
*/
__m128i tmp1 = _mm_shuffle_epi32(m2, 0x80);
__m128i tmp2 = _mm_shuffle_epi32(m1, 0x31);
__m128i m3 = _mm_or_si128(_mm_and_si128(mask, tmp1), _mm_andnot_si128(mask, m1));
__m128i m4 = _mm_or_si128(_mm_and_si128(mask, m2), _mm_andnot_si128(mask, tmp2));
print_data("m3", m3);
print_data("m4", m4);
}
我敢肯定,解壓縮變形稍微好一點...
但我想用SSE洗牌 – 2014-09-25 20:38:27
@MarcoA做。這是用來在單個寄存器中洗牌......我想在兩個寄存器之間洗牌 – 2014-09-25 20:46:05
對,對不起。我應該仔細閱讀 – 2014-09-25 20:46:58