[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