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]);
...
}