diff options
Diffstat (limited to 'ell_relax.c')
-rw-r--r-- | ell_relax.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/ell_relax.c b/ell_relax.c index 8d4cb34..a3f8968 100644 --- a/ell_relax.c +++ b/ell_relax.c @@ -15,6 +15,8 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include "config.h" + #include <float.h> #include <errno.h> #include <stdint.h> @@ -22,6 +24,7 @@ #include <string.h> #include "common.h" +#include "cpu.h" #include "ell_relax.h" #include "log.h" @@ -88,6 +91,17 @@ static const double fd_denoms[][ELL_RELAX_DIFF_COEFF_NB] = { }, }; +#if HAVE_EXTERNAL_ASM +void mg2di_residual_calc_line_s1_fma3(size_t linesize, double *dst, + ptrdiff_t stride, const double *u, const double *rhs, + const double * const diff_coeffs[ELL_RELAX_DIFF_COEFF_NB], + const double *fd_factors); +void mg2di_residual_calc_line_s2_fma3(size_t linesize, double *dst, + ptrdiff_t stride, const double *u, const double *rhs, + const double * const diff_coeffs[ELL_RELAX_DIFF_COEFF_NB], + const double *fd_factors); +#endif + static void derivatives_calc_s1(double *dst, const double *u, const double *fd_factors, ptrdiff_t stride) { @@ -345,9 +359,17 @@ int mg2di_ell_relax_init(EllRelaxContext *ctx) switch (ctx->fd_stencil) { case 1: priv->residual_calc_line = residual_calc_line_s1_c; +#if HAVE_EXTERNAL_ASM + if (ctx->cpuflags & MG2DI_CPU_FLAG_FMA3) + priv->residual_calc_line = mg2di_residual_calc_line_s1_fma3; +#endif break; case 2: priv->residual_calc_line = residual_calc_line_s2_c; +#if HAVE_EXTERNAL_ASM + if (ctx->cpuflags & MG2DI_CPU_FLAG_FMA3) + priv->residual_calc_line = mg2di_residual_calc_line_s2_fma3; +#endif break; default: mg2di_log(&ctx->logger, 0, "Invalid finite difference stencil: %zd\n", |