代码之家  ›  专栏  ›  技术社区  ›  Vojtěch Melda Meluzín

在llvm中,舍入比floor/ceil/int慢得多

  •  3
  • Vojtěch Melda Meluzín  · 技术社区  · 7 年前

    我通过执行以下循环来基准化一些基本的例程:

    float *src, *dst;
    for (int i=0; i<cnt; i++) dst[i] = round(src[i]);
    

    所有的AVX2目标,最新的clang。有趣的是,楼层(x),天花板(x),内部(x)一切似乎都很快。但是圆形(X)看起来非常缓慢,在研究拆卸时,有一些奇怪的意大利面条代码,而不是更新的SSE或AVX版本。即使在通过引入一些依赖项来阻止向量化循环的能力时,循环速度也慢了10倍。对于地板等,生成的代码使用VRounds,对于圆形,有意大利面代码…有什么想法吗?

    编辑:我使用的是FFAST数学,-MFP数学= SSE,-FNO数学ErnNO,-O3,-STD= C++ 17,-Malx= CARE-AVX2-MAVX2-MFMA

    2 回复  |  直到 7 年前
        1
  •  3
  •   Chris Dodd    7 年前

    问题是,没有一种SSE舍入模式指定正确的舍入 round :

    这些函数将x四舍五入为最接近的整数,但将0以外的半个事例四舍五入。 (无论当前取整方向如何,请参见fenv(3)),而不是最接近的取整方向 甚至整数,如rint(3)。

    如果你想要更快的代码,你可以尝试测试 rint 而不是 ,因为它指定了SSE支持的舍入模式。

        2
  •  1
  •   yonil    7 年前

    需要注意的一点是 floor(x + 0.5) ,但语义与 round(x) 在几乎所有的用例中,它都是一个有效的替代品,我怀疑它的速度比 floor(x) .

    推荐文章