commit e89649c454cfab1d3a275ac1d79000f6038fada6
parent 5e976f4c9200700b2c4b63859a49af65198ef198
Author: d.levin256@gmail.com <d.levin256@gmail.com>
Date: Fri, 14 Jun 2019 09:36:18 +0000
DFT shared library
Diffstat:
9 files changed, 274 insertions(+), 51 deletions(-)
diff --git a/dft/CMakeLists.txt b/dft/CMakeLists.txt
@@ -18,6 +18,22 @@
cmake_minimum_required(VERSION 3.1)
if (MSVC)
+ set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
+ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
+endif ()
+
+if(APPLE)
+ add_compile_options(-mmacosx-version-min=10.9)
+endif()
+
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/bin)
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/bin)
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/lib)
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/lib)
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/lib)
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/lib)
+
+if (MSVC)
set(LIBABI "vc${MSVC_TOOLSET_VERSION}")
elseif (WIN32)
set(LIBABI "mingw")
@@ -44,16 +60,48 @@ message(STATUS "LIBABI = ${LIBABI}")
add_custom_target(kfr_multiarch_dft)
+add_library(kfr_multidft INTERFACE)
+target_link_libraries(kfr_multidft INTERFACE kfr)
+if (NOT WIN32)
+ add_library(kfr_multidft_pic INTERFACE)
+ target_link_libraries(kfr_multidft_pic INTERFACE kfr)
+endif ()
+
function(add_dft_library ARCH)
add_library(kfr_dft_${LIBABI}_${ARCH} STATIC ${KFR_DFT_SRC})
target_link_libraries(kfr_dft_${LIBABI}_${ARCH} kfr)
- target_set_arch(kfr_dft_${LIBABI}_${ARCH} PUBLIC ${ARCH})
+ target_set_arch(kfr_dft_${LIBABI}_${ARCH} PRIVATE ${ARCH})
target_compile_options(kfr_dft_${LIBABI}_${ARCH} PRIVATE -Xclang -ffast-math)
add_dependencies(kfr_multiarch_dft kfr_dft_${LIBABI}_${ARCH})
+ target_link_libraries(kfr_multidft INTERFACE kfr_dft_${LIBABI}_${ARCH})
+
+ if (NOT WIN32)
+ add_library(kfr_dft_${LIBABI}_${ARCH}_pic STATIC ${KFR_DFT_SRC})
+ set_property(TARGET kfr_dft_${LIBABI}_${ARCH}_pic PROPERTY POSITION_INDEPENDENT_CODE 1)
+ target_link_libraries(kfr_dft_${LIBABI}_${ARCH}_pic kfr)
+ target_set_arch(kfr_dft_${LIBABI}_${ARCH}_pic PRIVATE ${ARCH})
+ target_compile_options(kfr_dft_${LIBABI}_${ARCH}_pic PRIVATE -Xclang -ffast-math)
+
+ target_link_libraries(kfr_multidft_pic INTERFACE kfr_dft_${LIBABI}_${ARCH}_pic)
+ endif()
endfunction()
add_dft_library(sse2)
add_dft_library(sse41)
add_dft_library(avx)
add_dft_library(avx2)
-add_dft_library(avx512)
-\ No newline at end of file
+add_dft_library(avx512)
+
+add_library(kfrdft SHARED ${PROJECT_SOURCE_DIR}/include/kfr/dft/impl/dft-src.cpp)
+target_compile_definitions(kfrdft PRIVATE -DKFR_DFT_MULTI=1 -DKFR_BUILDING_DLL=1)
+
+if (WIN32)
+ target_link_libraries(kfrdft PRIVATE kfr kfr_multidft)
+else ()
+ target_link_libraries(kfrdft PRIVATE kfr kfr_multidft_pic)
+
+ if (APPLE)
+ else ()
+ set_property(TARGET kfrdft APPEND PROPERTY LINK_LIBRARIES -nodefaultlibs -Wl,-Bdynamic -lm -lc -Wl,-Bstatic -lstdc++ -lgcc -s)
+ endif ()
+endif()
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
@@ -43,4 +43,8 @@ target_link_libraries(sample_rate_conversion kfr kfr_io use_arch)
if (ENABLE_DFT)
add_executable(dft dft.cpp)
target_link_libraries(dft kfr kfr_dft use_arch)
+ if (ENABLE_DFT_MULTIARCH)
+ target_link_libraries(dft kfr_multidft)
+ target_compile_definitions(dft PRIVATE -DKFR_DFT_MULTI=1)
+ endif ()
endif ()
diff --git a/examples/dft.cpp b/examples/dft.cpp
@@ -23,7 +23,13 @@ int main()
univector<complex<fbase>, size> out = scalar(qnan);
// initialize fft
- const dft_plan<fbase> dft(size);
+ const dft_plan<fbase> dft(
+#ifdef KFR_DFT_MULTI
+ cpu_t::runtime,
+#endif
+ size);
+
+ dft.dump();
// allocate work buffer for fft (if needed)
univector<u8> temp(dft.temp_size);
diff --git a/include/kfr/cident.h b/include/kfr/cident.h
@@ -28,6 +28,8 @@ extern char* gets(char* __s);
#define CMT_ARCH_AVX512 1
#define CMT_ARCH_AVX2 1
#define CMT_ARCH_AVX 1
+#define CMT_ARCH_SSE4_2 1
+#define CMT_ARCH_SSE4_1 1
#define CMT_ARCH_SSE42 1
#define CMT_ARCH_SSE41 1
#define CMT_ARCH_SSSE3 1
@@ -38,6 +40,8 @@ extern char* gets(char* __s);
#if defined __AVX2__ && !defined CMT_ARCH_AVX2
#define CMT_ARCH_AVX2 1
#define CMT_ARCH_AVX 1
+#define CMT_ARCH_SSE4_2 1
+#define CMT_ARCH_SSE4_1 1
#define CMT_ARCH_SSE42 1
#define CMT_ARCH_SSE41 1
#define CMT_ARCH_SSSE3 1
@@ -47,6 +51,8 @@ extern char* gets(char* __s);
#endif
#if defined __AVX__ && !defined CMT_ARCH_AVX
#define CMT_ARCH_AVX 1
+#define CMT_ARCH_SSE4_2 1
+#define CMT_ARCH_SSE4_1 1
#define CMT_ARCH_SSE42 1
#define CMT_ARCH_SSE41 1
#define CMT_ARCH_SSSE3 1
@@ -56,6 +62,8 @@ extern char* gets(char* __s);
#endif
#if defined __SSE4_2__ && !defined CMT_ARCH_SSE4_2
#define CMT_ARCH_SSE4_2 1
+#define CMT_ARCH_SSE42 1
+#define CMT_ARCH_SSE4_1 1
#define CMT_ARCH_SSE41 1
#define CMT_ARCH_SSSE3 1
#define CMT_ARCH_SSE3 1
@@ -64,6 +72,7 @@ extern char* gets(char* __s);
#endif
#if defined __SSE4_1__ && !defined CMT_ARCH_SSE4_1
#define CMT_ARCH_SSE4_1 1
+#define CMT_ARCH_SSE41 1
#define CMT_ARCH_SSSE3 1
#define CMT_ARCH_SSE3 1
#define CMT_ARCH_SSE2 1
@@ -115,20 +124,33 @@ extern char* gets(char* __s);
#if defined CMT_ARCH_AVX512
#define CMT_ARCH_NAME avx512
+#define CMT_ARCH_IS_AVX512 1
#elif defined CMT_ARCH_AVX2
#define CMT_ARCH_NAME avx2
+#define CMT_ARCH_IS_AVX2 1
#elif defined CMT_ARCH_AVX
#define CMT_ARCH_NAME avx
-#elif defined CMT_ARCH_SSE4_1
+#define CMT_ARCH_IS_AVX 1
+#elif defined CMT_ARCH_SSE42
+#define CMT_ARCH_NAME sse42
+#define CMT_ARCH_IS_SSE42 1
+#elif defined CMT_ARCH_SSE41
#define CMT_ARCH_NAME sse41
+#define CMT_ARCH_IS_SSE4 1
#elif defined CMT_ARCH_SSSE3
#define CMT_ARCH_NAME ssse3
+#define CMT_ARCH_IS_SSSE3 1
#elif defined CMT_ARCH_SSE3
#define CMT_ARCH_NAME sse3
+#define CMT_ARCH_IS_SSE3 1
#elif defined CMT_ARCH_SSE2
#define CMT_ARCH_NAME sse2
+#define CMT_ARCH_IS_SSE2 1
#elif defined CMT_ARCH_SSE
#define CMT_ARCH_NAME sse
+#define CMT_ARCH_IS_SSE 1
+#else
+#define CMT_ARCH_IS_GENERIC 1
#endif
#elif defined(CMT_ARCH_ARM)
diff --git a/include/kfr/dft/dft_c.h b/include/kfr/dft/dft_c.h
@@ -28,6 +28,26 @@
#include <stddef.h>
#include <stdint.h>
+#if defined(_M_X64) || defined(__x86_64__)
+#define KFR_CDECL
+#else
+#ifdef _WIN32
+#define KFR_CDECL __cdecl
+#else
+#define KFR_CDECL __attribute__((__cdecl__))
+#endif
+#endif
+
+#ifdef _WIN32
+#ifdef KFR_BUILDING_DLL
+#define KFR_API_SPEC KFR_CDECL __declspec(dllexport)
+#else
+#define KFR_API_SPEC KFR_CDECL __declspec(dllimport)
+#endif
+#else
+#define KFR_API_SPEC KFR_CDECL
+#endif
+
#ifdef __cplusplus
extern "C"
{
@@ -57,46 +77,54 @@ extern "C"
size_t size;
} KFR_DFT_REAL_PLAN_F64;
- enum KFR_DFT_PACK_FORMAT
+ typedef enum KFR_DFT_PACK_FORMAT
{
Perm = 0,
CCs = 1
- };
+ } KFR_DFT_PACK_FORMAT;
// Complex DFT plans
- KFR_DFT_PLAN_F32* kfr_dft_create_plan_f32(size_t size);
- KFR_DFT_PLAN_F64* kfr_dft_create_plan_f64(size_t size);
+ KFR_API_SPEC KFR_DFT_PLAN_F32* kfr_dft_create_plan_f32(size_t size);
+ KFR_API_SPEC KFR_DFT_PLAN_F64* kfr_dft_create_plan_f64(size_t size);
- void kfr_dft_execute_f32(KFR_DFT_PLAN_F32* plan, size_t size, float* out, const float* in, uint8_t* temp);
- void kfr_dft_execute_f64(KFR_DFT_PLAN_F64* plan, size_t size, double* out, const double* in,
- uint8_t* temp);
+ KFR_API_SPEC void kfr_dft_dump_f32(KFR_DFT_PLAN_F32* plan);
+ KFR_API_SPEC void kfr_dft_dump_f64(KFR_DFT_PLAN_F64* plan);
- void kfr_dft_execute_inverse_f32(KFR_DFT_PLAN_F32* plan, size_t size, float* out, const float* in,
- uint8_t* temp);
- void kfr_dft_execute_inverse_f64(KFR_DFT_PLAN_F64* plan, size_t size, double* out, const double* in,
- uint8_t* temp);
+ KFR_API_SPEC void kfr_dft_execute_f32(KFR_DFT_PLAN_F32* plan, float* out, const float* in, uint8_t* temp);
+ KFR_API_SPEC void kfr_dft_execute_f64(KFR_DFT_PLAN_F64* plan, double* out, const double* in,
+ uint8_t* temp);
- void kfr_dft_delete_plan_f32(KFR_DFT_PLAN_F32* plan);
- void kfr_dft_delete_plan_f64(KFR_DFT_PLAN_F64* plan);
+ KFR_API_SPEC void kfr_dft_execute_inverse_f32(KFR_DFT_PLAN_F32* plan, float* out, const float* in,
+ uint8_t* temp);
+ KFR_API_SPEC void kfr_dft_execute_inverse_f64(KFR_DFT_PLAN_F64* plan, double* out, const double* in,
+ uint8_t* temp);
+
+ KFR_API_SPEC void kfr_dft_delete_plan_f32(KFR_DFT_PLAN_F32* plan);
+ KFR_API_SPEC void kfr_dft_delete_plan_f64(KFR_DFT_PLAN_F64* plan);
// Real DFT plans
- KFR_DFT_REAL_PLAN_F32* kfr_dft_create_real_plan_f32(size_t size, KFR_DFT_PACK_FORMAT pack_format);
- KFR_DFT_REAL_PLAN_F64* kfr_dft_create_real_plan_f64(size_t size, KFR_DFT_PACK_FORMAT pack_format);
+ KFR_API_SPEC KFR_DFT_REAL_PLAN_F32* kfr_dft_create_real_plan_f32(size_t size,
+ KFR_DFT_PACK_FORMAT pack_format);
+ KFR_API_SPEC KFR_DFT_REAL_PLAN_F64* kfr_dft_create_real_plan_f64(size_t size,
+ KFR_DFT_PACK_FORMAT pack_format);
+
+ KFR_API_SPEC void kfr_dft_dump_real_f32(KFR_DFT_REAL_PLAN_F32* plan);
+ KFR_API_SPEC void kfr_dft_dump_real_f64(KFR_DFT_REAL_PLAN_F64* plan);
- void kfr_dft_execute_real_f32(KFR_DFT_REAL_PLAN_F32* plan, size_t size, float* out, const float* in,
- uint8_t* temp);
- void kfr_dft_execute_real_f64(KFR_DFT_REAL_PLAN_F64* plan, size_t size, double* out, const double* in,
- uint8_t* temp);
+ KFR_API_SPEC void kfr_dft_execute_real_f32(KFR_DFT_REAL_PLAN_F32* plan, float* out, const float* in,
+ uint8_t* temp);
+ KFR_API_SPEC void kfr_dft_execute_real_f64(KFR_DFT_REAL_PLAN_F64* plan, double* out, const double* in,
+ uint8_t* temp);
- void kfr_dft_execute_real_inverse_f32(KFR_DFT_REAL_PLAN_F32* plan, size_t size, float* out,
- const float* in, uint8_t* temp);
- void kfr_dft_execute_real_inverse_f64(KFR_DFT_REAL_PLAN_F64* plan, size_t size, double* out,
- const double* in, uint8_t* temp);
+ KFR_API_SPEC void kfr_dft_execute_real_inverse_f32(KFR_DFT_REAL_PLAN_F32* plan, float* out,
+ const float* in, uint8_t* temp);
+ KFR_API_SPEC void kfr_dft_execute_real_inverse_f64(KFR_DFT_REAL_PLAN_F64* plan, double* out,
+ const double* in, uint8_t* temp);
- void kfr_dft_delete_real_plan_f32(KFR_DFT_REAL_PLAN_F32* plan);
- void kfr_dft_delete_real_plan_f64(KFR_DFT_REAL_PLAN_F64* plan);
+ KFR_API_SPEC void kfr_dft_delete_real_plan_f32(KFR_DFT_REAL_PLAN_F32* plan);
+ KFR_API_SPEC void kfr_dft_delete_real_plan_f64(KFR_DFT_REAL_PLAN_F64* plan);
#ifdef __cplusplus
}
diff --git a/include/kfr/dft/fft.hpp b/include/kfr/dft/fft.hpp
@@ -133,6 +133,35 @@ template <typename T>
void dft_real_initialize(dft_plan_real<T>& plan);
} // namespace CMT_ARCH_NAME
+#ifdef KFR_DFT_MULTI
+
+#define KFR_DFT_PROTO(arch) \
+ namespace arch \
+ { \
+ template <typename T> \
+ void dft_initialize(dft_plan<T>& plan); \
+ template <typename T> \
+ void dft_real_initialize(dft_plan_real<T>& plan); \
+ }
+
+#if !CMT_ARCH_IS_AVX512
+KFR_DFT_PROTO(avx512)
+#endif
+#if !CMT_ARCH_IS_AVX2
+KFR_DFT_PROTO(avx2)
+#endif
+#if !CMT_ARCH_IS_AVX
+KFR_DFT_PROTO(avx)
+#endif
+#if !CMT_ARCH_IS_SSE41
+KFR_DFT_PROTO(sse41)
+#endif
+#if !CMT_ARCH_IS_SSE2
+KFR_DFT_PROTO(sse2)
+#endif
+
+#endif
+
/// @brief Class for performing DFT/FFT
template <typename T>
struct dft_plan
@@ -140,6 +169,34 @@ struct dft_plan
size_t size;
size_t temp_size;
+#ifdef KFR_DFT_MULTI
+ explicit dft_plan(cpu_t cpu, size_t size, dft_order order = dft_order::normal)
+ : size(size), temp_size(0), data_size(0)
+ {
+ if (cpu == cpu_t::runtime)
+ cpu = get_cpu();
+ switch (cpu)
+ {
+ case cpu_t::avx512:
+ avx512::dft_initialize(*this);
+ break;
+ case cpu_t::avx2:
+ avx2::dft_initialize(*this);
+ break;
+ case cpu_t::avx:
+ avx::dft_initialize(*this);
+ break;
+ case cpu_t::sse42:
+ case cpu_t::sse41:
+ sse41::dft_initialize(*this);
+ break;
+ default:
+ sse2::dft_initialize(*this);
+ break;
+ }
+ }
+#endif
+
explicit dft_plan(size_t size, dft_order order = dft_order::normal)
: size(size), temp_size(0), data_size(0)
{
@@ -277,6 +334,34 @@ struct dft_plan_real : dft_plan<T>
dft_pack_format fmt;
dft_stage_ptr<T> fmt_stage;
+#ifdef KFR_DFT_MULTI
+ explicit dft_plan_real(cpu_t cpu, size_t size, dft_pack_format fmt = dft_pack_format::CCs)
+ : dft_plan<T>(typename dft_plan<T>::noinit{}, size / 2), size(size), fmt(fmt)
+ {
+ if (cpu == cpu_t::runtime)
+ cpu = get_cpu();
+ switch (cpu)
+ {
+ case cpu_t::avx512:
+ avx512::dft_real_initialize(*this);
+ break;
+ case cpu_t::avx2:
+ avx2::dft_real_initialize(*this);
+ break;
+ case cpu_t::avx:
+ avx::dft_real_initialize(*this);
+ break;
+ case cpu_t::sse42:
+ case cpu_t::sse41:
+ sse41::dft_real_initialize(*this);
+ break;
+ default:
+ sse2::dft_real_initialize(*this);
+ break;
+ }
+ }
+#endif
+
explicit dft_plan_real(size_t size, dft_pack_format fmt = dft_pack_format::CCs)
: dft_plan<T>(typename dft_plan<T>::noinit{}, size / 2), size(size), fmt(fmt)
{
diff --git a/include/kfr/dft/impl/dft-src.cpp b/include/kfr/dft/impl/dft-src.cpp
@@ -33,36 +33,51 @@ namespace kfr
extern "C"
{
+#ifdef KFR_DFT_MULTI
+#define KFR_CPU_ARG cpu_t::runtime,
+#else
+#define KFR_CPU_ARG
+#endif
+
KFR_DFT_PLAN_F32* kfr_dft_create_plan_f32(size_t size)
{
- return reinterpret_cast<KFR_DFT_PLAN_F32*>(new kfr::dft_plan<float>(size));
+ if (size < 2)
+ return nullptr;
+ if (size > 16777216)
+ return nullptr;
+ return reinterpret_cast<KFR_DFT_PLAN_F32*>(new kfr::dft_plan<float>(KFR_CPU_ARG size));
}
KFR_DFT_PLAN_F64* kfr_dft_create_plan_f64(size_t size)
{
- return reinterpret_cast<KFR_DFT_PLAN_F64*>(new kfr::dft_plan<double>(size));
+ if (size < 2)
+ return nullptr;
+ if (size > 16777216)
+ return nullptr;
+ return reinterpret_cast<KFR_DFT_PLAN_F64*>(new kfr::dft_plan<double>(KFR_CPU_ARG size));
}
- void kfr_dft_execute_f32(KFR_DFT_PLAN_F32* plan, size_t, float* out, const float* in, uint8_t* temp)
+ void kfr_dft_dump_f32(KFR_DFT_PLAN_F32* plan) { reinterpret_cast<kfr::dft_plan<float>*>(plan)->dump(); }
+ void kfr_dft_dump_f64(KFR_DFT_PLAN_F64* plan) { reinterpret_cast<kfr::dft_plan<double>*>(plan)->dump(); }
+
+ void kfr_dft_execute_f32(KFR_DFT_PLAN_F32* plan, float* out, const float* in, uint8_t* temp)
{
reinterpret_cast<kfr::dft_plan<float>*>(plan)->execute(
reinterpret_cast<kfr::complex<float>*>(out), reinterpret_cast<const kfr::complex<float>*>(in),
temp, kfr::cfalse);
}
- void kfr_dft_execute_f64(KFR_DFT_PLAN_F64* plan, size_t, double* out, const double* in, uint8_t* temp)
+ void kfr_dft_execute_f64(KFR_DFT_PLAN_F64* plan, double* out, const double* in, uint8_t* temp)
{
reinterpret_cast<kfr::dft_plan<double>*>(plan)->execute(
reinterpret_cast<kfr::complex<double>*>(out), reinterpret_cast<const kfr::complex<double>*>(in),
temp, kfr::cfalse);
}
- void kfr_dft_execute_inverse_f32(KFR_DFT_PLAN_F32* plan, size_t, float* out, const float* in,
- uint8_t* temp)
+ void kfr_dft_execute_inverse_f32(KFR_DFT_PLAN_F32* plan, float* out, const float* in, uint8_t* temp)
{
reinterpret_cast<kfr::dft_plan<float>*>(plan)->execute(
reinterpret_cast<kfr::complex<float>*>(out), reinterpret_cast<const kfr::complex<float>*>(in),
temp, kfr::ctrue);
}
- void kfr_dft_execute_inverse_f64(KFR_DFT_PLAN_F64* plan, size_t, double* out, const double* in,
- uint8_t* temp)
+ void kfr_dft_execute_inverse_f64(KFR_DFT_PLAN_F64* plan, double* out, const double* in, uint8_t* temp)
{
reinterpret_cast<kfr::dft_plan<double>*>(plan)->execute(
reinterpret_cast<kfr::complex<double>*>(out), reinterpret_cast<const kfr::complex<double>*>(in),
@@ -82,34 +97,49 @@ extern "C"
KFR_DFT_REAL_PLAN_F32* kfr_dft_create_real_plan_f32(size_t size, KFR_DFT_PACK_FORMAT pack_format)
{
+ if (size < 4)
+ return nullptr;
+ if (size > 16777216)
+ return nullptr;
return reinterpret_cast<KFR_DFT_REAL_PLAN_F32*>(
- new kfr::dft_plan_real<float>(size, static_cast<dft_pack_format>(pack_format)));
+ new kfr::dft_plan_real<float>(KFR_CPU_ARG size, static_cast<dft_pack_format>(pack_format)));
}
KFR_DFT_REAL_PLAN_F64* kfr_dft_create_real_plan_f64(size_t size, KFR_DFT_PACK_FORMAT pack_format)
{
+ if (size < 4)
+ return nullptr;
+ if (size > 16777216)
+ return nullptr;
return reinterpret_cast<KFR_DFT_REAL_PLAN_F64*>(
- new kfr::dft_plan_real<double>(size, static_cast<dft_pack_format>(pack_format)));
+ new kfr::dft_plan_real<double>(KFR_CPU_ARG size, static_cast<dft_pack_format>(pack_format)));
+ }
+
+ KFR_API_SPEC void kfr_dft_dump_real_f32(KFR_DFT_REAL_PLAN_F32* plan)
+ {
+ reinterpret_cast<kfr::dft_plan_real<float>*>(plan)->dump();
+ }
+ KFR_API_SPEC void kfr_dft_dump_real_f64(KFR_DFT_REAL_PLAN_F64* plan)
+ {
+ reinterpret_cast<kfr::dft_plan_real<double>*>(plan)->dump();
}
- void kfr_dft_execute_real_f32(KFR_DFT_REAL_PLAN_F32* plan, size_t, float* out, const float* in,
- uint8_t* temp)
+ void kfr_dft_execute_real_f32(KFR_DFT_REAL_PLAN_F32* plan, float* out, const float* in, uint8_t* temp)
{
reinterpret_cast<kfr::dft_plan_real<float>*>(plan)->execute(
reinterpret_cast<kfr::complex<float>*>(out), in, temp);
}
- void kfr_dft_execute_real_f64(KFR_DFT_REAL_PLAN_F64* plan, size_t, double* out, const double* in,
- uint8_t* temp)
+ void kfr_dft_execute_real_f64(KFR_DFT_REAL_PLAN_F64* plan, double* out, const double* in, uint8_t* temp)
{
reinterpret_cast<kfr::dft_plan_real<double>*>(plan)->execute(
reinterpret_cast<kfr::complex<double>*>(out), in, temp);
}
- void kfr_dft_execute_real_inverse_f32(KFR_DFT_REAL_PLAN_F32* plan, size_t, float* out, const float* in,
+ void kfr_dft_execute_real_inverse_f32(KFR_DFT_REAL_PLAN_F32* plan, float* out, const float* in,
uint8_t* temp)
{
reinterpret_cast<kfr::dft_plan_real<float>*>(plan)->execute(
out, reinterpret_cast<const kfr::complex<float>*>(in), temp);
}
- void kfr_dft_execute_real_inverse__f64(KFR_DFT_REAL_PLAN_F64* plan, size_t, double* out, const double* in,
+ void kfr_dft_execute_real_inverse__f64(KFR_DFT_REAL_PLAN_F64* plan, double* out, const double* in,
uint8_t* temp, KFR_DFT_PACK_FORMAT pack_format)
{
reinterpret_cast<kfr::dft_plan_real<double>*>(plan)->execute(
@@ -125,4 +155,5 @@ extern "C"
delete reinterpret_cast<kfr::dft_plan_real<double>*>(plan);
}
}
+
} // namespace kfr
diff --git a/sources.cmake b/sources.cmake
@@ -152,7 +152,6 @@ set(
${PROJECT_SOURCE_DIR}/include/kfr/dft/impl/convolution-impl.cpp
${PROJECT_SOURCE_DIR}/include/kfr/dft/impl/dft-impl-f32.cpp
${PROJECT_SOURCE_DIR}/include/kfr/dft/impl/dft-impl-f64.cpp
- ${PROJECT_SOURCE_DIR}/include/kfr/dft/impl/dft-src.cpp
${PROJECT_SOURCE_DIR}/include/kfr/dft/impl/fft-impl-f32.cpp
${PROJECT_SOURCE_DIR}/include/kfr/dft/impl/fft-impl-f64.cpp
)
diff --git a/update-sources.py b/update-sources.py
@@ -7,14 +7,15 @@ import subprocess
import sys
import glob
-def list_sources(name, searchpath, masks):
+def list_sources(name, searchpath, masks, exclude = []):
global cmake
path = os.path.join(os.path.dirname(os.path.realpath(__file__)), searchpath)
filenames = []
for root, dirnames, files in os.walk(path, path):
for mask in masks:
- for filename in fnmatch.filter(files, mask):
- filenames.append(os.path.relpath(os.path.join(root, filename), path).replace('\\','/'))
+ for filename in fnmatch.filter(files, mask):=
+ if filename not in exclude:
+ filenames.append(os.path.relpath(os.path.join(root, filename), path).replace('\\','/'))
cmake += """
set(
@@ -30,7 +31,7 @@ cmake = """
"""
list_sources("KFR_SRC", "include", ['*.hpp', '*.h', '*.i', '*.inc'])
-list_sources("KFR_DFT_SRC", "include/kfr/dft", ['*.cpp'])
+list_sources("KFR_DFT_SRC", "include/kfr/dft", ['*.cpp'], ["dft-src.cpp"])
list_sources("KFR_IO_SRC", "include/kfr/io", ['*.cpp'])
list_sources("KFR_UNITTEST_SRC", "tests/unit", ['*.cpp'])