simd_load报不对齐错误



  • 定义一个数组指针,并让每个指针首地址256B对齐,
    double work[5000] attribute((aligned(32)));
    double *a[4][4];
    ...
    a[2][0]=work+256;
    simd_load(va,a[2][0]); //报错
    simd_load(va,a[2][0]+i); //不报错,i=0,
    i=0时,这两个应该是等价的,比较奇怪



  • 确实很奇怪。
    原因可能是栈上的数组不处理attribute。
    不过更奇怪的是栈上的定长数组本来就应该是256B对齐的。
    能先看下work的首地址吗?



  • @段晓辉 不不不,32B



  • 静态数组的首地址(32Byte)对齐编译器能够保证,打印出来也是,做加零偏移的处理 i=0; simd_load(va,a[0][2]+i);就可以;而simd_load(va,a[0[[2])总是执行报错不对齐。我是做vshff轮换,循环外那个初始赋值就是数组指针的首地址,但不加这个0偏移就报错,后来包括循环外的初始赋值我全写成+i(i=0)的形式(当然了循环内天然有偏移所以一直就没问题)
    i=0; ii=0;
    simd_load(va[0],a[m][n]+i);
    for(i=0;i<<nx;i+=4)
    {
    cur=(ii&1); ii++; nex=(ii&1);
    simd_load(va[0+nex],a[m][n]+i+4);
    vtmp=simd_vshff(va[0+nex],va[0+cur],0x4E);
    v_r=simd(vtmp, va[0+cur]);
    ...
    }


登录后回复