[Scipy-svn] r4291 - branches/refactor_fft/scipy/fftpack/src/djbfft

scipy-svn at scipy.org scipy-svn at scipy.org
Mon May 12 10:53:41 EDT 2008


Author: cdavid
Date: 2008-05-12 09:53:35 -0500 (Mon, 12 May 2008)
New Revision: 4291

Modified:
   branches/refactor_fft/scipy/fftpack/src/djbfft/convolve.cxx
Log:
djbfft backend for convolve now uses c++ cyclic cache.

Modified: branches/refactor_fft/scipy/fftpack/src/djbfft/convolve.cxx
===================================================================
--- branches/refactor_fft/scipy/fftpack/src/djbfft/convolve.cxx	2008-05-12 14:16:04 UTC (rev 4290)
+++ branches/refactor_fft/scipy/fftpack/src/djbfft/convolve.cxx	2008-05-12 14:53:35 UTC (rev 4291)
@@ -1,3 +1,8 @@
+#include <new>
+#include <cassert>
+
+#include "common.h"
+
 #ifdef WITH_FFTW
 #define destroy_convolve_cache_def destroy_convolve_cache_fftw
 #define convolve_def convolve_fftw
@@ -10,26 +15,57 @@
 #define init_convolution_kernel_def init_convolution_kernel_fftpack
 #endif
 
+#if 0
 GEN_CACHE(ddjbfft, (int n)
 	  , double *ptr;, (caches_ddjbfft[i].n == n)
 	  , caches_ddjbfft[id].ptr =
 	  (double *) malloc(sizeof(double) * n);,
 	  free(caches_ddjbfft[id].ptr);, 20)
+#endif
 
-extern "C" void destroy_convolve_cache(void)
+using namespace fft;
+
+class DDJBFFTCache: public Cache<DJBFFTCacheId> {
+        public:
+                DDJBFFTCache(const DJBFFTCacheId& id);
+                virtual ~DDJBFFTCache();
+
+                int convolve(double *inout, double *omega, 
+                             int swap_real_imag) const;
+                int convolve_z(double *inout, double *omega_real, 
+                               double* omega_imag) const;
+        protected:
+                double* m_ptr;
+};
+
+DDJBFFTCache::DDJBFFTCache(const DJBFFTCacheId& id)
+:	Cache<DJBFFTCacheId>(id)
 {
-	destroy_ddjbfft_caches();
-	destroy_convolve_cache_def();
+        int n = id.m_n;
+
+        m_ptr = (double *)malloc(sizeof(*m_ptr) * n);
+        if (m_ptr == NULL) {
+                goto fail;
+        }
+
+        return;
+
+fail:
+	throw std::bad_alloc();
 }
 
-/**************** convolve **********************/
-static void convolve_djbfft(int n, double *inout, double *omega, int swap_real_imag)
+DDJBFFTCache::~DDJBFFTCache()
 {
+        free(m_ptr);
+}
+
+int DDJBFFTCache::convolve(double *inout, double *omega, int swap_real_imag)
+        const
+{
 	int i;
-	double *ptr = NULL;
+	double *ptr = m_ptr;
+        int n = m_id.m_n;
 
-	i = get_cache_id_ddjbfft(n);
-	ptr = caches_ddjbfft[i].ptr;
 	COPYSTD2DJB(inout, ptr, n);
 	switch (n) {
 #define TMPCASE(N) case N: fftr8_##N(ptr); break
@@ -81,48 +117,19 @@
 #undef TMPCASE
 	}
 	COPYINVDJB2STD2(ptr, inout, n);
-}
 
-extern "C"
-void convolve(int n, double *inout, double *omega, int swap_real_imag)
-{
-	bool use_def = true;
-
-	switch (n) {
-	case 2:;
-	case 4:;
-	case 8:;
-	case 16:;
-	case 32:;
-	case 64:;
-	case 128:;
-	case 256:;
-	case 512:;
-	case 1024:;
-	case 2048:;
-	case 4096:;
-	case 8192:
-		use_def = false;
-	}
-
-	if (!use_def) {
-		convolve_djbfft(n, inout, omega, swap_real_imag);
-	} else {
-		convolve_def(n, inout, omega, swap_real_imag);
-	}
+        return 0;
 }
 
-/**************** convolve **********************/
-static void convolve_z_djbfft(int n, double *inout, double *omega_real,
-		    double *omega_imag)
+int DDJBFFTCache::convolve_z(double *inout, double *omega_real, double *omega_imag)
+        const
 {
 	int i;
-	double *ptr = NULL;
+        int n = m_id.m_n;
+	double *ptr = m_ptr;
 	int n1 = n - 1;
 	double c;
 
-	i = get_cache_id_ddjbfft(n);
-	ptr = caches_ddjbfft[i].ptr;
 	COPYSTD2DJB(inout, ptr, n);
 	switch (n) {
 #define TMPCASE(N) case N: fftr8_##N(ptr); break
@@ -170,10 +177,65 @@
 #undef TMPCASE
 	}
 	COPYINVDJB2STD2(ptr, inout, n);
-	return;
+	return 0;
 }
 
+static CacheManager <DJBFFTCacheId, DDJBFFTCache> ddjbfft_cmgr(20);
+
+/* stub */
+extern "C" void destroy_convolve_cache()
+{
+}
+
+/**************** convolve **********************/
+static void convolve_djbfft(int n, double *inout, double *omega, int swap_real_imag)
+{
+        DDJBFFTCache *cache;
+
+        cache = ddjbfft_cmgr.get_cache(DJBFFTCacheId(n));
+        cache->convolve(inout, omega, swap_real_imag);
+}
+
 extern "C"
+void convolve(int n, double *inout, double *omega, int swap_real_imag)
+{
+	bool use_def = true;
+
+	switch (n) {
+	case 2:;
+	case 4:;
+	case 8:;
+	case 16:;
+	case 32:;
+	case 64:;
+	case 128:;
+	case 256:;
+	case 512:;
+	case 1024:;
+	case 2048:;
+	case 4096:;
+	case 8192:
+		use_def = false;
+	}
+
+	if (!use_def) {
+		convolve_djbfft(n, inout, omega, swap_real_imag);
+	} else {
+		convolve_def(n, inout, omega, swap_real_imag);
+	}
+}
+
+/**************** convolve **********************/
+static void convolve_z_djbfft(int n, double *inout, double *omega_real,
+		    double *omega_imag)
+{
+        DDJBFFTCache *cache;
+
+        cache = ddjbfft_cmgr.get_cache(DJBFFTCacheId(n));
+        cache->convolve_z(inout, omega_real, omega_imag);
+}
+
+extern "C"
     void convolve_z(int n, double *inout, double *omega_real,
 		    double *omega_imag)
 {




More information about the Scipy-svn mailing list