summaryrefslogtreecommitdiff
path: root/ell_relax.c
diff options
context:
space:
mode:
Diffstat (limited to 'ell_relax.c')
-rw-r--r--ell_relax.c22
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",