2017-03-05 87 views
1

我有一個向量,存儲在AVX寄存器中的元素{a0,a1,a2,a3}。現在,我想提出三點新的向量(也應該被存儲爲__m256d變量),可以說,b,c和d,包含以下元素:AVX寄存器中的隨機元素

b = {a0,a1,a0,a0} 
c = {a1,a2,a2,a1} 
d = {a2,a3,a3,a2} 

我怎樣才能做到這一點使用AVX?

+0

您的意思是隻有AVX1?如果您可以使用AVX2,則效率更高:'b = _mm256_permute4x64_pd(a,_MM_SHUFFLE(0,1,0,0));'。 –

回答

5

參見編譯器如何做,使用gcc矢量擴展-march=core-avx2

#include <stdint.h> 

typedef double v4df __attribute__((vector_size(32))); 
typedef uint64_t v4u64 __attribute__((vector_size(32))); 

void foo(v4df a, v4df *b, v4df *c, v4df *d) 
{ 
    *b = __builtin_shuffle(a, (v4u64){0, 1, 0, 0}); 
    *c = __builtin_shuffle(a, (v4u64){1, 2, 2, 1}); 
    *d = __builtin_shuffle(a, (v4u64){2, 3, 3, 2}); 
} 

GCC-4.8.4 -march =芯AVX2 -O3生產:

vpermpd $4, %ymm0, %ymm1 
vmovapd %ymm1, (%rdi) 
vpermpd $105, %ymm0, %ymm1 
vpermpd $190, %ymm0, %ymm0 
vmovapd %ymm1, (%rsi) 
vmovapd %ymm0, (%rdx) 
vzeroupper 
ret 

GCC-4.8。 4 -march = corei7-avx -O3產生:

vinsertf128 $1, %xmm0, %ymm0, %ymm1 
vpermilpd $2, %ymm1, %ymm1 
vmovapd %ymm1, (%rdi) 
vperm2f128 $33, %ymm0, %ymm0, %ymm1 
vshufpd $9, %ymm1, %ymm0, %ymm1 
vmovapd %ymm1, (%rsi) 
vperm2f128 $49, %ymm0, %ymm0, %ymm0 
vpermilpd $6, %ymm0, %ymm0 
vmovapd %ymm0, (%rdx) 
vzeroupper 
ret