simd_avx.c 1002 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #include<simdheader.h>
  2. #ifndef I_CAN_HAZ_SIMD
  3. #error The correct internal header was not used
  4. #endif
  5. #include<simdconfig.h>
  6. #include<simdfuncs.h>
  7. #include<stdint.h>
  8. #ifdef _MSC_VER
  9. #include<intrin.h>
  10. int avx_available() {
  11. return 1;
  12. }
  13. #else
  14. #include<immintrin.h>
  15. #include<cpuid.h>
  16. #ifdef __APPLE__
  17. /*
  18. * Apple ships a broken __builtin_cpu_supports and
  19. * some machines in the CI farm seem to be too
  20. * old to have AVX so just always return 0 here.
  21. */
  22. int avx_available() { return 0; }
  23. #else
  24. int avx_available() {
  25. return __builtin_cpu_supports("avx");
  26. }
  27. #endif
  28. #endif
  29. void increment_avx(float arr[4]) {
  30. double darr[4];
  31. darr[0] = arr[0];
  32. darr[1] = arr[1];
  33. darr[2] = arr[2];
  34. darr[3] = arr[3];
  35. __m256d val = _mm256_loadu_pd(darr);
  36. __m256d one = _mm256_set1_pd(1.0);
  37. __m256d result = _mm256_add_pd(val, one);
  38. _mm256_storeu_pd(darr, result);
  39. arr[0] = (float)darr[0];
  40. arr[1] = (float)darr[1];
  41. arr[2] = (float)darr[2];
  42. arr[3] = (float)darr[3];
  43. }