root/libfftss/fftss_fma.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. fftss_try_normal
  2. fftss_try_fma
  3. fftss_test_fma

/*
 * Copyright (C) 2002-2007 Akira Nukada. All rights reserved.
 * Copyright (C) 2002-2007 The SSI Project. All rights reserved. 
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the project nor the names of its contributors 
 *       may be used to endorse or promote products derived from this software 
 *       without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE SSI PROJECT ``AS IS'' AND ANY EXPRESS 
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE SSI PROJECT BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 *  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 *
 */
#include <stdio.h>
#include "libfftss.h"

static double d[4];

static void fftss_try_normal(void)
{
  long i;

  double d0, d1, d2, d3;

  d0 = d[0];
  d1 = d[1];
  d2 = d[2];
  d3 = d[3];
  
  for (i = 0; i < (1<<14); i++)
    d0 = d2 * (d1 * (d0 + d1 - d3));

  if (d0 > 1.0) printf("error in fftss_try_normal\n");
}

static void fftss_try_fma(void)
{
  long i;

  double d0, d1, d2;

  d0 = d[0];
  d1 = d[1];
  d2 = d[3];
  
  for (i = 0; i < (1<<14); i++)
    d0 = (d0 * d1 + d2) * d1 + d2;

  if (d0 > 1.0) printf("error in fftss_try_fma\n");
}

int fftss_test_fma(void)
{
  double t0, t1;
  int available;

  d[0] = 1.0; d[1] = 0.5; d[2] = 2.0; d[3] = 0.5;

  t0 = fftss_get_wtime();
  fftss_try_normal();
  t0 = fftss_get_wtime() - t0;

  t1 = fftss_get_wtime();
  fftss_try_fma();
  t1 = fftss_get_wtime() - t1;

  printf("normal: %lf sec.\tfma: %lf sec.\n", t0, t1);
  available = (t0 > t1 * 1.5);
  printf("FMA instructions are %s.\n", 
         available ? "available" : "not available");

  return available;
}

/* [<][>][^][v][top][bottom][index][help] */