[PATCH] IPP, other minor changes

Nathan (Jasper) Myers ncm at codesourcery.com
Mon Oct 24 13:30:52 UTC 2005


I have checked in the patch below.  Mostly minor changes, but fixes 
four real bugs in Fir<>, and adds new benchmarks/fir.cpp.  Now
tests/ref-impl/signal-fir.cpp passes on sethra with IPP.

Nathan Myers
ncm

Index: ChangeLog
===================================================================
RCS file: /home/cvs/Repository/vpp/ChangeLog,v
retrieving revision 1.295
diff -u -p -r1.295 ChangeLog
--- ChangeLog	14 Oct 2005 16:00:47 -0000	1.295
+++ ChangeLog	24 Oct 2005 13:23:53 -0000
@@ -1,3 +1,14 @@
+2005-10-24  Nathan Myers  <ncm at codesourcery.com>
+
+	* configure.ac: fix help for "--enable-profile-timer".
+	* src/vsip/impl/sal.cpp: #if out if SAL not configured.
+	* src/vsip/impl/signal-fir.hpp: robustify assertions; make copy-ctor
+	  copy output size, fix overload ambiguity copying state_ member; 
+	  make op= return *this; make reset() clear state more thoroughly. 
+	* tests/fir.cpp: test copy ctor more thoroughly.
+	* benchmarks/fir.cpp: new.
+	* benchmarks/loop.hpp: quiet printf-format warnings.
+
 2005-10-14  Stefan Seefeld  <stefan at codesourcery.com>
 
 	* src/vsip/impl/ipp.hpp: Explicitely test for Cmplx_inter_fmt as IPP
Index: configure.ac
===================================================================
RCS file: /home/cvs/Repository/vpp/configure.ac,v
retrieving revision 1.44
diff -u -p -r1.44 configure.ac
--- configure.ac	14 Oct 2005 14:07:45 -0000	1.44
+++ configure.ac	24 Oct 2005 13:23:53 -0000
@@ -113,7 +113,7 @@ AC_ARG_WITH(mkl_prefix,
 
 
 AC_ARG_ENABLE([profile_timer],
-  AS_HELP_STRING([--profile-timer=type],
+  AS_HELP_STRING([--enable-profile-timer=type],
                  [set profile timer type.  Choices include none, posix, realtime, pentiumtsc, x86_64_tsc]),,
   [enable_profile_timer=none])
 
Index: benchmarks/fir.cpp
===================================================================
RCS file: benchmarks/fir.cpp
diff -N benchmarks/fir.cpp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ benchmarks/fir.cpp	24 Oct 2005 13:23:53 -0000
@@ -0,0 +1,130 @@
+/* Copyright (c) 2005 by CodeSourcery, LLC.  All rights reserved. */
+
+/** @file    benchmarks/fir.cpp
+    @author  Jules Bergmann, Nathan Myers
+    @date    2005-08-13
+    @brief   VSIPL++ Library: Benchmark for FIR filter.
+
+*/
+
+/***********************************************************************
+  Included Files
+***********************************************************************/
+
+#include <iostream>
+
+#include <vsip/initfin.hpp>
+#include <vsip/support.hpp>
+#include <vsip/math.hpp>
+#include <vsip/signal.hpp>
+
+#include <vsip/impl/profile.hpp>
+
+#include "test.hpp"
+#include "loop.hpp"
+#include "ops_info.hpp"
+
+using namespace vsip;
+
+template <obj_state      Save,
+	  length_type    Dec,
+	  typename       T>
+struct t_fir1
+{
+
+  char* what() { return "t_fir1"; }
+
+  float ops_per_point(length_type size)
+  {
+    float ops = (coeff_size_ * size / Dec) *
+      (Ops_info<T>::mul + Ops_info<T>::add);
+
+    return ops / size;
+  }
+
+  int riob_per_point(length_type)
+    { return 2 * this->coeff_size_ * sizeof(T); }
+
+  int wiob_per_point(length_type)
+    { return this->coeff_size_ * sizeof(T); }
+
+  void operator()(length_type size, length_type loop, float& time)
+  {
+    typedef Fir<T,nonsym,Save> fir_type;
+
+    Vector<T>   coeff(coeff_size_, T());
+    coeff(0) = T(1);
+    coeff(1) = T(2);
+
+    fir_type fir(coeff, size, Dec);
+
+    Vector<T>   in (size, T());
+    Vector<T>   out(fir.output_size());
+
+    vsip::impl::profile::Timer t1;
+    
+    t1.start();
+    for (index_type l=0; l<loop; ++l)
+      fir(in, out);
+    t1.stop();
+    
+    time = t1.delta();
+  }
+
+  t_fir1(length_type coeff_size) : coeff_size_(coeff_size) {}
+
+  length_type coeff_size_;
+};
+
+
+
+void
+defaults(Loop1P& loop)
+{
+  loop.loop_start_ = 1000;
+  loop.start_ = 4;
+  loop.user_param_ = 16;
+}
+
+//  Non-symmetric, non-continuous, where kernel size and decimation 
+//  are parameters and input size is swept. 
+//    Float and complex<float> value types.
+//
+//  Non-symmetric, continuous, where kernel size and decimation 
+//  are parameters and input size is swept.
+//    Float and complex<float> value types.
+
+int
+test(Loop1P& loop, int what)
+{
+  typedef std::complex<float> CX;
+  switch (what)
+  {
+  case  1: loop(t_fir1<state_no_save,1u,float>(loop.user_param_)); break;
+  case  2: loop(t_fir1<state_no_save,2u,float>(loop.user_param_)); break;
+  case  3: loop(t_fir1<state_no_save,4u,float>(loop.user_param_)); break;
+  case  4: loop(t_fir1<state_no_save,5u,float>(loop.user_param_)); break;
+  case  5: loop(t_fir1<state_no_save,8u,float>(loop.user_param_)); break;
+
+  case  6: loop(t_fir1<state_no_save,1u,CX>(loop.user_param_)); break;
+  case  7: loop(t_fir1<state_no_save,2u,CX>(loop.user_param_)); break;
+  case  8: loop(t_fir1<state_no_save,4u,CX>(loop.user_param_)); break;
+  case  9: loop(t_fir1<state_no_save,5u,CX>(loop.user_param_)); break;
+  case  10: loop(t_fir1<state_no_save,8u,CX>(loop.user_param_)); break;
+
+  case  11: loop(t_fir1<state_save,1u,float>(loop.user_param_)); break;
+  case  12: loop(t_fir1<state_save,2u,float>(loop.user_param_)); break;
+  case  13: loop(t_fir1<state_save,4u,float>(loop.user_param_)); break;
+  case  14: loop(t_fir1<state_save,5u,float>(loop.user_param_)); break;
+  case  15: loop(t_fir1<state_save,8u,float>(loop.user_param_)); break;
+
+  case  16: loop(t_fir1<state_save,1u,CX>(loop.user_param_)); break;
+  case  17: loop(t_fir1<state_save,2u,CX>(loop.user_param_)); break;
+  case  18: loop(t_fir1<state_save,4u,CX>(loop.user_param_)); break;
+  case  19: loop(t_fir1<state_save,5u,CX>(loop.user_param_)); break;
+  case  20: loop(t_fir1<state_save,8u,CX>(loop.user_param_)); break;
+
+  default: return 0;
+  }
+  return 1;
+}
Index: benchmarks/loop.hpp
===================================================================
RCS file: /home/cvs/Repository/vpp/benchmarks/loop.hpp,v
retrieving revision 1.4
diff -u -p -r1.4 loop.hpp
--- benchmarks/loop.hpp	7 Sep 2005 12:19:30 -0000	1.4
+++ benchmarks/loop.hpp	24 Oct 2005 13:23:53 -0000
@@ -152,7 +152,7 @@ Loop1P::operator()(
 	                                                       "*unknown*");
   if (this->note_)
     printf("# note: %s\n", this->note_);
-  printf("# start_loop       : %d\n", loop);
+  printf("# start_loop       : %lu\n", (unsigned long) loop);
 
   if (this->do_prof_)
     vsip::impl::profile::prof->set_mode(vsip::impl::profile::pm_accum);
@@ -167,25 +167,26 @@ Loop1P::operator()(
 
     if (this->do_prof_)
     {
-      sprintf(filename, "vprof.%d.out", M);
+      sprintf(filename, "vprof.%lu.out", (unsigned long) M);
       vsip::impl::profile::prof->dump(filename);
     }
 
     std::sort(mtime.begin(), mtime.end());
 
     if (this->metric_ == all_per_sec)
-      printf("%7d %f %f %f\n", M,
+      printf("%7ld %f %f %f\n", (unsigned long) M,
 	  this->metric(fcn, M, loop, mtime[(n_time-1)/2], pts_per_sec),
 	  this->metric(fcn, M, loop, mtime[(n_time-1)/2], ops_per_sec),
 	  this->metric(fcn, M, loop, mtime[(n_time-1)/2], iob_per_sec));
     else if (n_time > 1)
       // Note: max time is min op/s, and min time is max op/s
-      printf("%7d %f %f %f\n", M,
+      printf("%7lu %f %f %f\n", (unsigned long) M,
 	  this->metric(fcn, M, loop, mtime[(n_time-1)/2], metric_),
 	  this->metric(fcn, M, loop, mtime[n_time-1],     metric_),
 	  this->metric(fcn, M, loop, mtime[0],            metric_));
     else
-      printf("%7d %f\n", M, this->metric(fcn, M, loop, mtime[0], metric_));
+      printf("%7lu %f\n", (unsigned long) M,
+              this->metric(fcn, M, loop, mtime[0], metric_));
 
     time = mtime[(n_time-1)/2];
 
Index: src/vsip/impl/sal.cpp
===================================================================
RCS file: /home/cvs/Repository/vpp/src/vsip/impl/sal.cpp,v
retrieving revision 1.1
diff -u -p -r1.1 sal.cpp
--- src/vsip/impl/sal.cpp	14 Oct 2005 14:07:45 -0000	1.1
+++ src/vsip/impl/sal.cpp	24 Oct 2005 13:23:53 -0000
@@ -7,6 +7,8 @@
                Mercury SAL.
 */
 
+#if defined(VSIP_IMPL_HAVE_SAL)
+
 /***********************************************************************
   Included Files
 ***********************************************************************/
@@ -313,3 +315,4 @@ void vdiv(std::pair<double*, double*> co
 } // namespace vsip::impl
 } // namespace vsip
 
+#endif
Index: src/vsip/impl/signal-fir.hpp
===================================================================
RCS file: /home/cvs/Repository/vpp/src/vsip/impl/signal-fir.hpp,v
retrieving revision 1.3
diff -u -p -r1.3 signal-fir.hpp
--- src/vsip/impl/signal-fir.hpp	13 Oct 2005 10:23:34 -0000	1.3
+++ src/vsip/impl/signal-fir.hpp	24 Oct 2005 13:23:53 -0000
@@ -137,7 +137,9 @@ public:
 #endif
   {
     assert(input_size > 0);
-    assert(this->order_ + 1 > 1);  // counter unsigned wraparound
+    assert(kernel.size() > 0);
+    // spec says a nonsym kernel size has to be >1, but symmetric can be ==1:
+    assert(this->kernel_.size() > (symV == vsip::nonsym));
     assert(decimation > 0);
     assert(this->order_ + 1 > decimation);  // M >= decimation
     assert(input_size >= this->order_);  // input_size >= M 
@@ -170,13 +172,14 @@ public:
   // FIXME: spec says this should be nothrow, but it has to allocate
   Fir(Fir const& fir)  VSIP_THROW((std::bad_alloc))
   : input_size_(fir.input_size_)
+  , output_size_(fir.output_size_)
   , order_(fir.order_)
   , decimation_(fir.decimation_)
   , skip_(fir.skip_)
   , op_calls_(0)
   , kernel_(fir.kernel_)
-  , state_(fir.state_(vsip::Domain<1>(fir.state_.size())))  // actual copy
-  , state_saved_(fir.state_saved_)
+  , state_(fir.state_.get(vsip::Domain<1>(fir.state_.size())))  // actual copy
+  , state_saved_(fir.state_saved_) 
 #if VSIP_IMPL_HAVE_IPP
   , temp_in_(this->input_size_)   // allocate
   , temp_out_(this->input_size_)  // allocate
@@ -193,6 +196,7 @@ public:
     this->kernel_ = fir.kernel_;
     this->state_ = fir.state_;
     this->state_saved_ = fir.state_saved_;
+    return *this;
   }
 
   ~Fir()  VSIP_NOTHROW {}
@@ -299,7 +303,8 @@ public:
   }
 
   void reset()  VSIP_NOTHROW
-    { this->state_saved_ = this->skip_ = 0; }
+    { this->state_saved_ = this->skip_ = 0;
+      this->state_ = T(0.0); }
 
 public:
 
Index: tests/fir.cpp
===================================================================
RCS file: /home/cvs/Repository/vpp/tests/fir.cpp,v
retrieving revision 1.3
diff -u -p -r1.3 fir.cpp
--- tests/fir.cpp	13 Oct 2005 10:23:34 -0000	1.3
+++ tests/fir.cpp	24 Oct 2005 13:23:53 -0000
@@ -96,7 +96,7 @@ test_fir(
     vsip::const_Vector<>(vsip::length_type(3),vsip::scalar_f(1)), N*10);
   assert(dummy.decimation() == 1);
   vsip::Fir<T,sym,vsip::state_save,1>  fir1a(kernel, N, D);
-  vsip::Fir<T,sym,vsip::state_save,1>  fir1b(kernel, N, D);
+  vsip::Fir<T,sym,vsip::state_save,1>  fir1b(fir1a);
   vsip::Fir<T,sym,vsip::state_no_save,1>  fir2(kernel, N, D);
 
   assert(fir1a.symmetry == sym);
@@ -107,13 +107,18 @@ test_fir(
   const vsip::length_type  order = (sym == vsip::nonsym) ? M :
     (sym == vsip::sym_even_len_even) ? 2 * M : (2 * M) - 1;
   assert(fir1a.kernel_size() == order);
+  assert(fir1b.kernel_size() == order);
   assert(fir1a.filter_order() == order);
+  assert(fir1b.filter_order() == order);
   // assert(fir1a.symmetry()
   assert(fir1a.input_size() == N);
+  assert(fir1b.input_size() == N);
   assert(fir1a.output_size() == (N+D-1)/D);
+  assert(fir1b.output_size() == (N+D-1)/D);
   assert(fir1a.continuous_filtering() == fir1a.continuous_filter);
   assert(fir2.continuous_filtering() == fir2.continuous_filter);
   assert(fir1a.decimation() == D);
+  assert(fir1b.decimation() == D);
 
   vsip::length_type got = 0;
   for (vsip::length_type i = 0; i < 2 * M; ++i) // chained



More information about the vsipl++ mailing list