[arrayfire] 28/79: Fixed fftconvolve() bug, resulting in wrong output

Ghislain Vaillant ghisvail-guest at moszumanska.debian.org
Mon Jun 15 13:38:04 UTC 2015


This is an automated email from the git hooks/post-receive script.

ghisvail-guest pushed a commit to branch master
in repository arrayfire.

commit ec96aa0577aad18dd726c530555daabffb3716f7
Author: Peter Andreas Entschev <peter at arrayfire.com>
Date:   Mon Jun 8 13:02:39 2015 -0400

    Fixed fftconvolve() bug, resulting in wrong output
    
    The bug caused FFTs to be computed for smaller sizes, thus, losing data. This
    would only be noticed for particular combinations of dimension 0 sizes of
    signal and filter arrays.
---
 src/backend/cpu/fftconvolve.cpp    | 7 +++++++
 src/backend/cuda/fftconvolve.cu    | 9 +++++++++
 src/backend/opencl/fftconvolve.cpp | 7 +++++++
 3 files changed, 23 insertions(+)

diff --git a/src/backend/cpu/fftconvolve.cpp b/src/backend/cpu/fftconvolve.cpp
index 9e52879..fe12740 100644
--- a/src/backend/cpu/fftconvolve.cpp
+++ b/src/backend/cpu/fftconvolve.cpp
@@ -239,6 +239,13 @@ Array<T> fftconvolve(Array<T> const& signal, Array<T> const& filter,
         else
             packed_dims[k] = 1;
 
+        unsigned df0  = nextpow2((unsigned)((int)ceil(sd[0] / 2.f) + fd[0] - 1));
+
+        // Adjust dimension 0 size if ceil(signal/2.f)+filter-1 won't fit in
+        // packed_dims[0]
+        if (k == 0 && df0 == packed_dims[0])
+            packed_dims[0] *= 2;
+
         if (k < baseDim) {
             fft_dims[baseDim-k-1] = (k == 0) ? packed_dims[k] / 2 : packed_dims[k];
             fftScale *= fft_dims[baseDim-k-1];
diff --git a/src/backend/cuda/fftconvolve.cu b/src/backend/cuda/fftconvolve.cu
index 14b7da0..37f8c7c 100644
--- a/src/backend/cuda/fftconvolve.cu
+++ b/src/backend/cuda/fftconvolve.cu
@@ -45,6 +45,15 @@ static const dim4 calcPackedSize(Array<T> const& i1,
             pd[k] = 1;
     }
 
+    dim_t max_d0 = (i1d[0] > i2d[0]) ? i1d[0] : i2d[0];
+    dim_t min_d0 = (i1d[0] < i2d[0]) ? i1d[0] : i2d[0];
+    unsigned df0  = nextpow2((unsigned)((int)ceil(max_d0 / 2.f) + min_d0 - 1));
+
+    // Adjust dimension 0 size if ceil(signal/2.f)+filter-1 won't fit in
+    // packed_dims[0]
+    if (df0 == (pd[0]*2))
+        pd[0] *= 2;
+
     return dim4(pd[0], pd[1], pd[2], pd[3]);
 }
 
diff --git a/src/backend/opencl/fftconvolve.cpp b/src/backend/opencl/fftconvolve.cpp
index cb4ef6c..3bec3ba 100644
--- a/src/backend/opencl/fftconvolve.cpp
+++ b/src/backend/opencl/fftconvolve.cpp
@@ -44,6 +44,13 @@ static const dim4 calcPackedSize(Array<T> const& i1,
             pd[k] = 1;
     }
 
+    unsigned df0  = nextpow2((unsigned)((int)ceil(i1d[0] / 2.f) + i2d[0] - 1));
+
+    // Adjust dimension 0 size if ceil(signal/2.f)+filter-1 won't fit in
+    // packed_dims[0]
+    if (df0 == (pd[0]*2))
+        pd[0] *= 2;
+
     return dim4(pd[0], pd[1], pd[2], pd[3]);
 }
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/arrayfire.git



More information about the debian-science-commits mailing list