小编Eik*_*ike的帖子

INTEL SIMD:为什么现场乘法这么慢?

我已经编写了一些矢量方法,这些方法可以进行简单的数学就地计算或复制,并且对于就地变体共享相同的惩罚.

最简单的可以归结为这样的东西:

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)

有趣的是,相同的行为不适用于添加,即+ =很好地工作,只有*=是一个问题..

-

评论已经回答了这个问题.在人工测试期间它是非正规的.

c++ sse simd multiplication in-place

3
推荐指数
1
解决办法
172
查看次数

标签 统计

c++ ×1

in-place ×1

multiplication ×1

simd ×1

sse ×1