我已经编写了一些矢量方法,这些方法可以进行简单的数学就地计算或复制,并且对于就地变体共享相同的惩罚.
最简单的可以归结为这样的东西:
void scale(float* dst, const float* src, int count, float factor)
{
__m128 factorV = _mm_set1_ps(factorV);
for(int i = 0; i < count; i+= 4)
{
__m128 in = _mm_load_ps(src);
in = _mm_mul_ps(in, factorV);
_mm_store_ps(dst, in);
dst += 4;
src += 4;
}
}
Run Code Online (Sandbox Code Playgroud)
测试代码:
for(int i = 0; i < 1000000; i++)
{
scale(alignedMemPtrDst, alignedMemPtrSrc, 256, randomFloatAbsRange1);
}
Run Code Online (Sandbox Code Playgroud)
在测试时,即在SAME缓冲区上重复操作此函数时,我发现如果dst和src相同,速度是相同的.如果它们不同,它的速度要快70倍.写作时主要循环(即_mm_store_ps)
有趣的是,相同的行为不适用于添加,即+ =很好地工作,只有*=是一个问题..
-
评论已经回答了这个问题.在人工测试期间它是非正规的.