gpt4 book ai didi

c++ - 英特尔 SIMD : why is inplace multiplication so slow?

转载 作者:太空狗 更新时间:2023-10-29 20:20:08 27 4
gpt4 key购买 nike

我已经编写了一些 vector 方法,这些方法可以就地或复制进行简单的数学运算,并且对就地变体具有相同的惩罚。

最简单的可以归结为如下内容:

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;
}
}

测试代码:

for(int i = 0; i < 1000000; i++)
{
scale(alignedMemPtrDst, alignedMemPtrSrc, 256, randomFloatAbsRange1);
}

测试时,即在SAME buffer上反复运行这个函数,发现如果dst和src相同,速度是一样的。如果它们不同,它的速度大约快 70 倍。写入时燃烧的主要周期(即 _mm_store_ps)

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

--

这已在评论中得到解答。人工测试时异常。

最佳答案

您的因素是否产生低于正常的结果?非零但小于 FLT_MIN?如果在此之外有一个循环在同一个 block 上重复就地循环,数字可能会变得足够小,需要缓慢的 FP 辅助

(Turns out, yes 这是 OP 的问题)。

重复就地乘法使数字越来越小,因子低于 1.0。复制和缩放到不同的缓冲区每次都使用相同的输入。

生成 +-InfNaN 结果不需要额外的时间,但至少在 Intel CPU 上它会逐渐下溢到次正常。这就是 -ffast-math 设置 DAZ/FTZ - 下溢清零的原因之一。


我想我读过 AMD 没有对次正规的 FP 辅助微编码处理,但 Intel 有。

fp_assist.any 的 Intel CPU 上有一个性能计数器,它会在次正常结果需要额外的微代码微指令来处理特殊情况时计数。 (我认为它与前端和 OoO 执行人员一样具有侵入性。不过它肯定很慢。)


Why denormalized floats are so much slower than other floats, from hardware architecture viewpoint?

Why is icc generating weird assembly for a simple main? (展示了 ICC 如何在 main 的开头设置 FTZ/DAZ,这是默认的快速数学设置。)

关于c++ - 英特尔 SIMD : why is inplace multiplication so slow?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53507874/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com