我试图加快使用SSE我的代码,然后将以下代码效果很好。 基本上,__m128变量应该指向一行中的4个浮点数,以便一次执行4个操作。解决非整数的地址,和SSE
此代码相当于计算c[i]=a[i]+b[i]
与i
从0
到3
。
float *data1,*data2,*data3
// ... code ... allocating data1-2-3 which are very long.
__m128* a = (__m128*) (data1);
__m128* b = (__m128*) (data2);
__m128* c = (__m128*) (data3);
*c = _mm_add_ps(*a, *b);
然而,当欲移位一个比特,我使用的数据(见下文),以计算与c[i]=a[i+1]+b[i]
从i
到0
3
,它在craches执行时间。
__m128* a = (__m128*) (data1+1); // <-- +1
__m128* b = (__m128*) (data2);
__m128* c = (__m128*) (data3);
*c = _mm_add_ps(*a, *b);
我的猜测是它与__m128是128位,浮点数据是32位有关。因此,它可能是不可能的128位指针指向的不是整除128
反正地址,你知道是什么问题,我怎么可能去走一走呢?
您有未定义的行为。指向'float'的指针与* __m128指针不同*。另外,当你执行'data1 + 1'和'&data1 [1]'做同样的事情时,你真的已经分配了多个'float'并将指针存储在'data1'中吗? –
是的,data1,data2,data3中有很多数据。他们分配得很好。 – Oli
@JoachimPileborg,什么是无约束的行为?我知道指向float和__m128的指针是不同的。这就是我投的原因。 __mm128应该指向连续4个浮点数,以便在CPU上一次执行所有4个操作。 – Oli