#if defined(USE_AVX) && defined(__AVX__) #ifndef _MSC_VER #include #else #include #endif #include "AVX.h" void THDoubleVector_copy_AVX(double *y, const double *x, const ptrdiff_t n) { ptrdiff_t i; ptrdiff_t off; for (i=0; i<=((n)-8); i+=8) { _mm256_storeu_pd(y+i, _mm256_loadu_pd(x+i)); _mm256_storeu_pd(y+i+4, _mm256_loadu_pd(x+i+4)); } off = (n) - ((n)%8); for (i=0; i<((n)%8); i++) { y[off+i] = x[off+i]; } } void THDoubleVector_fill_AVX(double *x, const double c, const ptrdiff_t n) { ptrdiff_t i; ptrdiff_t off; __m256d YMM0 = _mm256_set_pd(c, c, c, c); for (i=0; i<=((n)-16); i+=16) { _mm256_storeu_pd((x)+i , YMM0); _mm256_storeu_pd((x)+i+4, YMM0); _mm256_storeu_pd((x)+i+8, YMM0); _mm256_storeu_pd((x)+i+12, YMM0); } off = (n) - ((n)%16); for (i=0; i<((n)%16); i++) { x[off+i] = c; } } void THDoubleVector_cdiv_AVX(double *z, const double *x, const double *y, const ptrdiff_t n) { ptrdiff_t i; __m256d YMM0, YMM1, YMM2, YMM3; for (i=0; i<=((n)-8); i+=8) { YMM0 = _mm256_loadu_pd(x+i); YMM1 = _mm256_loadu_pd(x+i+4); YMM2 = _mm256_loadu_pd(y+i); YMM3 = _mm256_loadu_pd(y+i+4); YMM2 = _mm256_div_pd(YMM0, YMM2); YMM3 = _mm256_div_pd(YMM1, YMM3); _mm256_storeu_pd(z+i, YMM2); _mm256_storeu_pd(z+i+4, YMM3); } for (; i<(n); i++) { z[i] = x[i] / y[i]; } } void THDoubleVector_divs_AVX(double *y, const double *x, const double c, const ptrdiff_t n) { ptrdiff_t i; __m256d YMM15 = _mm256_set_pd(c, c, c, c); __m256d YMM0, YMM1; for (i=0; i<=((n)-8); i+=8) { YMM0 = _mm256_loadu_pd(x+i); YMM1 = _mm256_loadu_pd(x+i+4); YMM0 = _mm256_div_pd(YMM0, YMM15); YMM1 = _mm256_div_pd(YMM1, YMM15); _mm256_storeu_pd(y+i, YMM0); _mm256_storeu_pd(y+i+4, YMM1); } for (; i<(n); i++) { y[i] = x[i] / c; } } void THDoubleVector_cmul_AVX(double *z, const double *x, const double *y, const ptrdiff_t n) { ptrdiff_t i; __m256d YMM0, YMM1, YMM2, YMM3; for (i=0; i<=((n)-8); i+=8) { YMM0 = _mm256_loadu_pd(x+i); YMM1 = _mm256_loadu_pd(x+i+4); YMM2 = _mm256_loadu_pd(y+i); YMM3 = _mm256_loadu_pd(y+i+4); YMM2 = _mm256_mul_pd(YMM0, YMM2); YMM3 = _mm256_mul_pd(YMM1, YMM3); _mm256_storeu_pd(z+i, YMM2); _mm256_storeu_pd(z+i+4, YMM3); } for (; i