https://gcc.gnu.org/bugzilla/show_bug.cgi?id=40770
--- Comment #21 from 康 珊 <kangshan0910 at hotmail dot com> --- (In reply to Jakub Jelinek from comment #15) > OpenMP has a way to express this, > #pragma omp declare simd notinbranch linear(y,z) > double sincos (double x, double *y, double *z); > As can be seen on -O2 -fopenmp-simd: > #pragma omp declare simd notinbranch linear(y, z) > double foo (double x, double *y, double *z); > > double a[1024], b[1024], c[1024]; > > void > bar (void) > { > #pragma omp simd > for (int i = 0; i < 1024; i++) > foo (a[i], &b[i], &c[i]); > } > it works fine with that. But if #pragma omp simd is commented out, it is > not, because the compiler has no assurance on what the function call > behavior will be e.g. for data reference analysis (it could e.g. modify the > global vars). > Now, for sincos proper, the compiler knows what the function does if not > -fno-builtin-sincos. > > Unfortunately, I think glibc currently defines sincos in math-vector.h the > unuseful way with just simd ("notinbranch") attribute, which effectively > means > that the caller is supposed to pass vectors of pointers (well integers with > those sizes) and so needs scatter under the hood. > So the best thing would be to change glibc first. Thanks for your reply.(In reply to Jakub Jelinek from comment #15) > OpenMP has a way to express this, > #pragma omp declare simd notinbranch linear(y,z) > double sincos (double x, double *y, double *z); > As can be seen on -O2 -fopenmp-simd: > #pragma omp declare simd notinbranch linear(y, z) > double foo (double x, double *y, double *z); > > double a[1024], b[1024], c[1024]; > > void > bar (void) > { > #pragma omp simd > for (int i = 0; i < 1024; i++) > foo (a[i], &b[i], &c[i]); > } > it works fine with that. But if #pragma omp simd is commented out, it is > not, because the compiler has no assurance on what the function call > behavior will be e.g. for data reference analysis (it could e.g. modify the > global vars). > Now, for sincos proper, the compiler knows what the function does if not > -fno-builtin-sincos. > > Unfortunately, I think glibc currently defines sincos in math-vector.h the > unuseful way with just simd ("notinbranch") attribute, which effectively > means > that the caller is supposed to pass vectors of pointers (well integers with > those sizes) and so needs scatter under the hood. > So the best thing would be to change glibc first. Thanks for your reply. I tried your method. But it still doesn't work for sincos. #pragma omp declare simd notinbranch linear(y, z) void sincos(double x, double *y, double *z); for (unsigned int i = 0; i < loopCount; i++) { #pragma omp simd for (unsigned int j = i * dim; j < (i + 1) * dim; j++) { sincos(input_array[j], &result_array[j], &result_array1[j]); } } $ gcc -m64 -g -O2 -fopenmp-simd -fPIC -Wall test_sincos.c -o test_sincos -lm -march=skylake-avx512 -ffast-math -ftree-loop-vectorize $ ldd test_sincos linux-vdso.so.1 (0x00007ffd2393f000) libm.so.6 => /lib64/libm.so.6 (0x00007f574f49d000) libc.so.6 => /lib64/libc.so.6 (0x00007f574f2a2000) /lib64/ld-linux-x86-64.so.2 (0x00007f574f601000) My gcc version is "10.1.1 20200507". And I have uploaded my test source file.