gpt4 book ai didi

c++ - 在gcc中使用 vector 内在函数对规则数组进行别名

转载 作者:行者123 更新时间:2023-11-28 01:45:31 25 4
gpt4 key购买 nike

我正在研究 GCC 中的 vector 内在函数,尤其是 AVX,我很想写这样的东西来在两个数组之间进行 vector 乘法:

#include <unistd.h>

void __attribute__((target("avx"))) vmul(float* __restrict__ cc, const float* __restrict__ aa, const float* __restrict__ bb, ssize_t size) {
const ssize_t VECSIZE=8;
typedef float vfloat __attribute__((vector_size(sizeof(float)*VECSIZE)));

// duff's device, process any remainder up front
ssize_t rem = size % VECSIZE;
switch (rem) {
case 7: cc[6] = aa[6]*bb[6]; /* FALLTHRU */
case 6: cc[5] = aa[5]*bb[5]; /* FALLTHRU */
case 5: cc[4] = aa[4]*bb[4]; /* FALLTHRU */
case 4: cc[3] = aa[3]*bb[3]; /* FALLTHRU */
case 3: cc[2] = aa[2]*bb[2]; /* FALLTHRU */
case 2: cc[1] = aa[1]*bb[1]; /* FALLTHRU */
case 1: cc[0] = aa[0]*bb[0]; /* FALLTHRU */
case 0: break;
}
size -= rem;

// process rest of array
const vfloat *va = (const vfloat*)(aa+rem);
const vfloat *vb = (const vfloat*)(bb+rem);
vfloat *vc = (vfloat*)(cc+rem);

for (ssize_t ii=0; ii < size; ii++) {
vc[ii] = va[ii]*vb[ii];
}
}

int main() {
}

问题是将数据转换为 vector 类型所需的指针别名。 GCC 很乐意让您这样做(使用 -Wall -Wextra -ansi -pedantic 没有警告),但随后假设底层内存对齐是合适的。所以它在内部循环中生成 vmovaps 指令:

   0x0000000000400660 <+176>:   vmovaps (%rsi,%rax,1),%ymm0
0x0000000000400665 <+181>: vmulps (%rdx,%rax,1),%ymm0,%ymm0
0x000000000040066a <+186>: vmovaps %ymm0,(%rdi,%rax,1)
0x000000000040066f <+191>: add $0x20,%rax
0x0000000000400673 <+195>: cmp %r8,%rax
0x0000000000400676 <+198>: jne 0x400660 <_Z4vmulPfPKfS1_l+176>

这很好,直到您传入一些未对齐的内存(或者在我的情况下大小不是 8 的倍数),然后它很乐意让您的程序出现段错误,试图使用对齐的指令加载未对齐的内存。

有没有合适的方法用 vector 扩展来做到这一点?

最佳答案

您可以 reduce the alignment像这样:

typedef float vfloat __attribute__((vector_size(sizeof(float)*VECSIZE),
aligned(4)));

有了这个改变,我得到了 vmovups 指令。

关于c++ - 在gcc中使用 vector 内在函数对规则数组进行别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45305884/

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