如何让Clang/GCC在向量化时调用libmvec的sincosf向量版本?
问题:Clang/GCC向量化含sinf/cosf的循环时未调用libmvec的sincos向量版本
在对包含sinf()和cosf()的循环做向量化优化时,我发现Clang和GCC没有利用libmvec库中sincos()的向量版本,这和6年前Stack Overflow上的相关问题一致。
代码示例
void func( float * p, int n, float a, float b ) { n = 8*4; for( int i = 0; i < n; i++ ) { #pragma omp simd safelen(8) simdlen(8) aligned(p) for( int j = 0; j < n; j++ ) { float angle = a*j+b*i; p[j+i*n] += a * sinf( angle ) + b * cosf( angle ); } } }
对应编译选项:
- GCC:
-O3 -march=haswell -fopt-info-vec-missed -fopenmp-simd -ffast-math - Clang:
-O3 -march=haswell -fopenmp-simd -ffast-math -fveclib=libmvec - ICC:
-O3 -march=haswell
各编译器输出行为
- GCC:完全未做向量化,仅调用libm中的
sincosf,这是一个已被记录但未修复的已知Bug(Bug编号:70901)。 - Clang:单独对
sinf()和cosf()做向量化,调用libmvec中的_ZGVdN8v_sinf和_ZGVdN8v_cosf。 - ICC:实现了完整向量化,调用
__svml_sincosf8_l9。
求助
有没有可行的解决方法,能让Clang(以及GCC)调用libmvec的_ZGVdN8vvv_sincosf?
内容的提问来源于stack exchange,提问作者northwindow
相关产品推荐
相关产品推荐

