gpt4 book ai didi

c - 随机排列 AVX 寄存器中的元素

转载 作者:行者123 更新时间:2023-12-01 23:15:05 24 4
gpt4 key购买 nike

我有一个 double vector ,存储在 AVX 寄存器中,其元素为 {a0,a1,a2,a3} 。现在,我想创建三个新 vector (也应存储为 __m256d 变量),例如 b、c 和 d,其中包含以下元素:

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

如何使用 AVX 执行此操作?

最佳答案

了解编译器如何使用 -march=core-avx2gcc vector 扩展来实现此目的

#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=core-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

关于c - 随机排列 AVX 寄存器中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42608196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com