我正在通过执行循环来基准测试一些重要的例程,例如:
float *src, *dst;
for (int i=0; i<cnt; i++) dst[i] = round(src[i]);
所有目标都是AVX2,使用最新的CLANG。有趣的是,floor(x)、ceil(x)、int(x)...似乎都很快。但round(x)非常慢,查看反汇编代码发现一些奇怪的代码,而不是较新的SSE或AVX版本。即使通过引入一些依赖关系阻止向量化循环的能力,round也比较慢。对于floor等,生成的代码使用vroundss,而对于round,则有Spaghetti Code... 有什么想法吗?
编辑:我使用了-ffast-math,-mfpmath=sse,-fno-math-errno,-O3,-std=c++17,-march=core-avx2 -mavx2 -mfma
-ffast-math
编译选项生成的汇编代码对于round
和floor
函数来说基本相同。 - SergeyAround
,而是用于floor
(除非打开-ffast-math)。我也很好奇为什么会这样。可能只是实现质量的问题。 - SergeyA