gpt4 book ai didi

c++ - 我可以使用 AVX2 分散指令来加速某些加​​载吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:55 25 4
gpt4 key购买 nike

我分析了我拥有的一个 AVX2-heavy 函数,瓶颈如下所示:

std::uint64_t data[8];

// Some computation that fills data

std::uint64_t X[4] = { data[7], data[5], data[3], data[1] };
__m256i vec = _mm256_loadu_si256(reinterpret_cast<__m256i*>(X));

// Compute more with vec
// Later on use data[6], data[4], data[2], and data[0] in a similar fashion

实际上,数组也是适当对齐的(所以 load 而不是 loadu)。但问题是,是否有使用 AVX(2) 执行此操作的更快方法?具体来说,我正在查看收集说明。我可以使用它们从 data 初始化 vec 吗?或者是否还有其他一些说明值得一试?

最佳答案

很难在不知道编译器生成什么代码的情况下发表评论,但这里有一些我的编译器 (gcc) 不得不说的事情。

typedef unsigned long long uint64_t;
typedef uint64_t vec2 __attribute__((vector_size(8*sizeof(uint64_t))));
typedef uint64_t vec __attribute__((vector_size(4*sizeof(uint64_t))));
vec f(vec a,vec b){
vec i={7,5,3,1};
return __builtin_shuffle(a,b,i);
}
vec g(vec2 x){
vec r={x[7],x[5],x[3],x[1]};
return r;
}

我得到 f:

vpunpckhqdq %ymm1, %ymm0, %ymm1
vpermq $39, %ymm1, %ymm0

我按值传递 vector ,通过指针传递它们会给出:

vmovdqa (%rdi), %ymm0
vpunpckhqdq (%rsi), %ymm0, %ymm0
vpermq $39, %ymm0, %ymm0

对于g:

vmovq   32(%rsp), %xmm2
vmovq 64(%rsp), %xmm3
vpinsrq $1, 16(%rsp), %xmm2, %xmm1
vpinsrq $1, 48(%rsp), %xmm3, %xmm0
vinserti128 $0x1, %xmm1, %ymm0, %ymm0

关于c++ - 我可以使用 AVX2 分散指令来加速某些加​​载吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24539569/

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