2017-03-05 85 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