[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