【发布时间】:2011-02-25 14:06:25
【问题描述】:
在我的项目中,我实现了基本类 CVector。 此类包含指向原始浮点数组的 float* 指针。 该数组是使用标准 malloc() 函数动态分配的。
现在我必须使用这样的向量来加速一些计算。不幸的是,由于没有使用 _mm_malloc() 分配内存,所以它没有对齐。
据我了解,我有两种选择:
1) 重写分配内存以使用 _mm_malloc() 的代码,例如使用如下代码:
void sub(float* v1, float* v2, float* v3, int size)
{
__m128* p_v1 = (__m128*)v1;
__m128* p_v2 = (__m128*)v2;
__m128 res;
for(int i = 0; i < size/4; ++i)
{
res = _mm_sub_ps(*p_v1,*p_v2);
_mm_store_ps(v3,res);
++p_v1;
++p_v2;
v3 += 4;
}
}
2) 第二种选择是使用 _mm_loadu_ps() 指令从未对齐的内存中加载 __m128,然后将其用于计算。
void sub(float* v1, float* v2, float* v3, int size)
{
__m128 p_v1;
__m128 p_v2;
__m128 res;
for(int i = 0; i < size/4; ++i)
{
p_v1 = _mm_loadu_ps(v1);
p_v2 = _mm_loadu_ps(v2);
res = _mm_sub_ps(p_v1,p_v2);
_mm_store_ps(v3,res);
v1 += 4;
v2 += 4;
v3 += 4;
}
}
所以我的问题是哪个选项会更好或更快?
【问题讨论】: