Backport fixes for IPP v9

This commit is contained in:
Chris Cannam
2018-05-14 20:41:25 +01:00
parent 4d63c025e2
commit 486ab5de62
4 changed files with 266 additions and 134 deletions

View File

@@ -35,6 +35,7 @@
#endif
#ifdef HAVE_IPP
#include <ippversion.h>
#include <ipps.h>
#endif
@@ -148,13 +149,21 @@ public:
~D_IPP() {
if (m_fspec) {
#if (IPP_VERSION_MAJOR >= 9)
ippsFree(m_fspecbuf);
#else
ippsFFTFree_R_32f(m_fspec);
#endif
ippsFree(m_fbuf);
ippsFree(m_fpacked);
ippsFree(m_fspare);
}
if (m_dspec) {
#if (IPP_VERSION_MAJOR >= 9)
ippsFree(m_dspecbuf);
#else
ippsFFTFree_R_64f(m_dspec);
#endif
ippsFree(m_dbuf);
ippsFree(m_dpacked);
ippsFree(m_dspare);
@@ -170,6 +179,20 @@ public:
void initFloat() {
if (m_fspec) return;
#if (IPP_VERSION_MAJOR >= 9)
int specSize, specBufferSize, bufferSize;
ippsFFTGetSize_R_32f(m_order, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast,
&specSize, &specBufferSize, &bufferSize);
m_fspecbuf = ippsMalloc_8u(specSize);
Ipp8u *tmp = ippsMalloc_8u(specBufferSize);
m_fbuf = ippsMalloc_8u(bufferSize);
m_fpacked = ippsMalloc_32f(m_size + 2);
m_fspare = ippsMalloc_32f(m_size / 2 + 1);
ippsFFTInit_R_32f(&m_fspec,
m_order, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast,
m_fspecbuf, tmp);
ippsFree(tmp);
#else
int specSize, specBufferSize, bufferSize;
ippsFFTGetSize_R_32f(m_order, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast,
&specSize, &specBufferSize, &bufferSize);
@@ -178,10 +201,25 @@ public:
m_fspare = ippsMalloc_32f(m_size / 2 + 1);
ippsFFTInitAlloc_R_32f(&m_fspec, m_order, IPP_FFT_NODIV_BY_ANY,
ippAlgHintFast);
#endif
}
void initDouble() {
if (m_dspec) return;
#if (IPP_VERSION_MAJOR >= 9)
int specSize, specBufferSize, bufferSize;
ippsFFTGetSize_R_64f(m_order, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast,
&specSize, &specBufferSize, &bufferSize);
m_dspecbuf = ippsMalloc_8u(specSize);
Ipp8u *tmp = ippsMalloc_8u(specBufferSize);
m_dbuf = ippsMalloc_8u(bufferSize);
m_dpacked = ippsMalloc_64f(m_size + 2);
m_dspare = ippsMalloc_64f(m_size / 2 + 1);
ippsFFTInit_R_64f(&m_dspec,
m_order, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast,
m_dspecbuf, tmp);
ippsFree(tmp);
#else
int specSize, specBufferSize, bufferSize;
ippsFFTGetSize_R_64f(m_order, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast,
&specSize, &specBufferSize, &bufferSize);
@@ -190,6 +228,7 @@ public:
m_dspare = ippsMalloc_64f(m_size / 2 + 1);
ippsFFTInitAlloc_R_64f(&m_dspec, m_order, IPP_FFT_NODIV_BY_ANY,
ippAlgHintFast);
#endif
}
void packFloat(const float *R__ re, const float *R__ im) {
@@ -401,6 +440,8 @@ private:
int m_order;
IppsFFTSpec_R_32f *m_fspec;
IppsFFTSpec_R_64f *m_dspec;
Ipp8u *m_fspecbuf;
Ipp8u *m_dspecbuf;
Ipp8u *m_fbuf;
Ipp8u *m_dbuf;
float *m_fpacked;
@@ -1569,6 +1610,7 @@ public:
#endif
bool save = false;
if (m_extantf > 0 && --m_extantf == 0) save = true;
(void)save;
#ifndef FFTW_DOUBLE_ONLY
if (save) saveWisdom('f');
#endif
@@ -1586,6 +1628,7 @@ public:
#endif
bool save = false;
if (m_extantd > 0 && --m_extantd == 0) save = true;
(void)save;
#ifndef FFTW_SINGLE_ONLY
if (save) saveWisdom('d');
#endif