Skip to contentSkip to conversation

package/fftw: add a bunch of optimisations (branch yem/fftw)

PATCH Superseded Yann E. MORIN 3 participants 14 messages Mar 16, 2015

v6 of 7 Superseded Latest is v7 →

lore
Share & tools
lore
#0 lore raw

v6 cover package/fftw: add a bunch of optimisations (branch yem/fftw)

Hello All!

This series aggregates misc optimisation patches for out fftw package, based on work by Gwenhael and Guillaume.

Thanks to both for their previous work! :-)

Changes v5 -> v6:
- architecture optimisations are not available for all precisions (Thomas, Gwenhael)

Changes v4 -> v5:
- use --disable-XXX in first patch
- add architecture optimisations for x86 and ARM
- add other optimisations (threads, openMP, fast maths)

Regards,
Yann E. MORIN.

The following changes since commit c511ca937d4627df7d601a999945faa20fe4cc8d:

network-manager: add hash file (2015-03-16 14:19:30 +0100)

are available in the git repository at:

git://git.busybox.net/~ymorin/git/buildroot yem/fftw

for you to fetch changes up to 0842316b8be377f09daf4c2f6a8d05fd303237d8:

package/fftw: add option for fast maths (2015-03-16 14:37:43 +0100)

----------------------------------------------------------------
Gwenhael Goavec-Merou (1):
fftw: add compile precision option

Yann E. MORIN (6):
package/fftw: add x86 optimisations package/fftw: add ARM optimisations package/fftw: disable fortran
package/fftw: enable threads when the tooclhain has them package/fftw: enable OpenMP if the compiler has that package/fftw: add option for fast maths

 package/fftw/Config.in | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++
 package/fftw/fftw.mk   | 21 +++++++++++++++++
 2 files changed, 84 insertions(+)
Signature · 6 lines
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'
#1 lore raw

PATCH v6 1/7 fftw: add compile precision option

From: Gwenhael Goavec-Merou <[email protected]>

fftw has options to select compile precision between single, long-double and quad. These options are exclusives. This patch adds choice to select precision option.

[yann.morin.1998 at free.fr: use --disable-XXX when not enabled]
Cc guillaume william brs <[email protected]>
---
 package/fftw/Config.in | 38 ++++++++++++++++++++++++++++++++++++++
 package/fftw/fftw.mk   |  4 ++++
 2 files changed, 42 insertions(+)
package/fftw/Config.in +38 -0
index 36f849f..7fa2c4c 100644
@@ -9,3 +9,41 @@ config BR2_PACKAGE_FFTW
 	  double precision.
 
 	  http://www.fftw.org
+
+if BR2_PACKAGE_FFTW
+
+choice
+	prompt "fftw precision"
+	default BR2_PACKAGE_FFTW_PRECISION_NONE
+	help
+	  Selects fftw precision
+
+config BR2_PACKAGE_FFTW_PRECISION_NONE
+	bool "none"
+	help
+	  no compile precision selected
+
+config BR2_PACKAGE_FFTW_PRECISION_SINGLE
+	bool "single precision"
+	help
+	  compile fftw in single precision
+
+config BR2_PACKAGE_FFTW_PRECISION_LONG_DOUBLE
+	bool "long double precision"
+	# long-double precision require long-double trigonometric routines
+	depends on !(BR2_TOOLCHAIN_BUILDROOT_UCLIBC && \
+		(BR2_arm || BR2_mips || BR2_mipsel))
+
+	help
+	  compile fftw in long-double precision
+
+config BR2_PACKAGE_FFTW_PRECISION_QUAD
+	bool "quad precision"
+	# quad-precision needs to have a gcc with libquadmath
+	depends on (BR2_i386 || BR2_x86_64) && BR2_USE_WCHAR
+	help
+	  compile fftw in quadruple precision if available
+
+endchoice
+
+endif
package/fftw/fftw.mk +4 -0
index 3b302df..78d36e9 100644
@@ -10,4 +10,8 @@ FFTW_INSTALL_STAGING = YES
 FFTW_LICENSE = GPLv2+
 FFTW_LICENSE_FILES = COPYING
 
+FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_PRECISION_SINGLE),--enable,--disable)-single
+FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_PRECISION_LONG_DOUBLE),--enable,--disable)-long-double
+FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_PRECISION_QUAD),--enable,--disable)-quad-precision
+
 $(eval $(autotools-package))
Signature · 1 line
1.9.1
#2 lore raw

PATCH v6 2/7 package/fftw: add x86 optimisations

In reply to Yann E. MORIN
Cc Gwenhael Goavec-Merou <[email protected]>
Cc guillaume william brs <[email protected]>

---
Changes v5 -> v6:
- SSE/SSE2 can't be enabled for all precisions (Gwenhael)

---
 package/fftw/Config.in | 10 +++++++++-
 package/fftw/fftw.mk   |  4 ++++
 2 files changed, 13 insertions(+), 1 deletion(-)
package/fftw/Config.in +9 -1
index 7fa2c4c..30c395f 100644
@@ -12,6 +12,12 @@ config BR2_PACKAGE_FFTW
 
 if BR2_PACKAGE_FFTW
 
+config BR2_PACKAGE_FFTW_USE_SSE
+	bool
+
+config BR2_PACKAGE_FFTW_USE_SSE2
+	bool
+
 choice
 	prompt "fftw precision"
 	default BR2_PACKAGE_FFTW_PRECISION_NONE
@@ -25,6 +31,8 @@ config BR2_PACKAGE_FFTW_PRECISION_NONE
 
 config BR2_PACKAGE_FFTW_PRECISION_SINGLE
 	bool "single precision"
+	select BR2_PACKAGE_FFTW_USE_SSE if BR2_X86_CPU_HAS_SSE
+	select BR2_PACKAGE_FFTW_USE_SSE2 if BR2_X86_CPU_HAS_SSE2
 	help
 	  compile fftw in single precision
 
@@ -33,7 +41,7 @@ config BR2_PACKAGE_FFTW_PRECISION_LONG_DOUBLE
 	# long-double precision require long-double trigonometric routines
 	depends on !(BR2_TOOLCHAIN_BUILDROOT_UCLIBC && \
 		(BR2_arm || BR2_mips || BR2_mipsel))
-
+	select BR2_PACKAGE_FFTW_USE_SSE2 if BR2_X86_CPU_HAS_SSE2
 	help
 	  compile fftw in long-double precision
 
package/fftw/fftw.mk +4 -0
index 78d36e9..18239e8 100644
@@ -14,4 +14,8 @@ FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_PRECISION_SINGLE),--enable,--disable)-
 FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_PRECISION_LONG_DOUBLE),--enable,--disable)-long-double
 FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_PRECISION_QUAD),--enable,--disable)-quad-precision
 
+# x86 optimisations
+FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_USE_SSE),--enable,--disable)-sse
+FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_USE_SSE2),--enable,--disable)-sse2
+
 $(eval $(autotools-package))
Signature · 1 line
1.9.1
#3 lore raw

PATCH v6 3/7 package/fftw: add ARM optimisations

In reply to Yann E. MORIN
[based on a patch by Guillaume]
Cc guillaume william brs <[email protected]>
Cc Gwenhael Goavec-Merou <[email protected]>

---
Changes v5 -> v6:
- NEON can't be used by all precisions (Gwenhael)

---
 package/fftw/Config.in | 4 ++++
 package/fftw/fftw.mk   | 3 +++
 2 files changed, 7 insertions(+)
package/fftw/Config.in +4 -0
index 30c395f..a0f353c 100644
@@ -18,6 +18,9 @@ config BR2_PACKAGE_FFTW_USE_SSE
 config BR2_PACKAGE_FFTW_USE_SSE2
 	bool
 
+config BR2_PACKAGE_FFTW_USE_NEON
+	bool
+
 choice
 	prompt "fftw precision"
 	default BR2_PACKAGE_FFTW_PRECISION_NONE
@@ -33,6 +36,7 @@ config BR2_PACKAGE_FFTW_PRECISION_SINGLE
 	bool "single precision"
 	select BR2_PACKAGE_FFTW_USE_SSE if BR2_X86_CPU_HAS_SSE
 	select BR2_PACKAGE_FFTW_USE_SSE2 if BR2_X86_CPU_HAS_SSE2
+	select BR2_PACKAGE_FFTW_USE_NEON if BR2_ARM_FPU_NEON
 	help
 	  compile fftw in single precision
 
package/fftw/fftw.mk +3 -0
index 18239e8..be99210 100644
@@ -18,4 +18,7 @@ FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_PRECISION_QUAD),--enable,--disable)-qu
 FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_USE_SSE),--enable,--disable)-sse
 FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_USE_SSE2),--enable,--disable)-sse2
 
+# ARM optimisations
+FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_USE_NEON),--enable,--disable)-neon
+
 $(eval $(autotools-package))
Signature · 1 line
1.9.1
#4 lore raw

PATCH v6 3/7 package/fftw: add ARM optimisations

Dear Yann E. MORIN
On Mon, 16 Mar 2015 14:54:01 +0100
"Yann E. MORIN" <[email protected]> wrote:
[SNIP]

package/fftw/Config.in config BR2_PACKAGE_FFTW_PRECISION_SINGLE · line 40

Quoted 9 lines

choice

package/fftw/Config.in +1 -0
 	prompt "fftw precision"
 	default BR2_PACKAGE_FFTW_PRECISION_NONE
@@ -33,6 +36,7 @@ config BR2_PACKAGE_FFTW_PRECISION_SINGLE
 	bool "single precision"
 	select BR2_PACKAGE_FFTW_USE_SSE if BR2_X86_CPU_HAS_SSE
 	select BR2_PACKAGE_FFTW_USE_SSE2 if BR2_X86_CPU_HAS_SSE2
+	select BR2_PACKAGE_FFTW_USE_NEON if BR2_ARM_FPU_NEON
 	help

[SNIP]
s/BR2_ARM_FPU_NEON/BR2_ARM_CPU_HAS_NEON/

Regards

Gwen

#5 lore raw

PATCH v6 3/7 package/fftw: add ARM optimisations

Gwenhael, All,

On 2015-03-16 15:30 +0100, gwenhael.goavec spake thusly:

Quoted 4 lines

Dear Yann E. MORIN
On Mon, 16 Mar 2015 14:54:01 +0100
"Yann E. MORIN" <[email protected]> wrote:
[SNIP]

Quoted 11 lines

package/fftw/Config.in config BR2_PACKAGE_FFTW_PRECISION_SINGLE · line 40

Quoted 9 lines

choice

package/fftw/Config.in +1 -0
 	prompt "fftw precision"
 	default BR2_PACKAGE_FFTW_PRECISION_NONE
@@ -33,6 +36,7 @@ config BR2_PACKAGE_FFTW_PRECISION_SINGLE
 	bool "single precision"
 	select BR2_PACKAGE_FFTW_USE_SSE if BR2_X86_CPU_HAS_SSE
 	select BR2_PACKAGE_FFTW_USE_SSE2 if BR2_X86_CPU_HAS_SSE2
+	select BR2_PACKAGE_FFTW_USE_NEON if BR2_ARM_FPU_NEON
 	help

[SNIP]
s/BR2_ARM_FPU_NEON/BR2_ARM_CPU_HAS_NEON/

No, because even if the CPU has NEON, it is not enough for NEOn to be enabled.

That's what I initially tried, but it did not work, as fftw compiles parts of its code without specifying -mfpu=neon, and thus it falls to the value specified by Buildroot, and the compilation breaks.

I should probably have said so in the commit log, indeed...

Regards,
Yann E. MORIN.

Signature · 6 lines
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'
#6 lore raw

PATCH v6 3/7 package/fftw: add ARM optimisations

Dear Yann E. MORIN,

Quoted 3 lines · Yann E. MORIN

That's what I initially tried, but it did not work, as fftw compiles parts of its code without specifying -mfpu=neon, and thus it falls to the value specified by Buildroot, and the compilation breaks.

In this case, pass -mfpu=neon explicitly, like we do in mplayer and vo-aacenc. Using NEON as the general purpose FPU is quite unlikely, since using NEON for FPU is not IEEE 754. So most likely people will use VFPv3/4 as the FPU, but may be interested in using NEON for specific things.

Thomas

Signature · 3 lines
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com
#7 lore raw

PATCH v6 4/7 package/fftw: disable fortran

In reply to Yann E. MORIN

We do not have any fortran package and we do not build a fortran compiler.

Still, an external toolchain may have a fortran compiler and that is totally useless to us, since we anyway have no fortran package...

So, entirely disable fortran support; that will at least slightly speed up the build in case an external toolchain has a fortran compiler.

[based on a patch by Guillaume]
Cc guillaume william brs <[email protected]>
Cc Gwenhael Goavec-Merou <[email protected]>
---
 package/fftw/fftw.mk | 2 ++
 1 file changed, 2 insertions(+)
package/fftw/fftw.mk +2 -0
index be99210..333e13b 100644
@@ -10,6 +10,8 @@ FFTW_INSTALL_STAGING = YES
 FFTW_LICENSE = GPLv2+
 FFTW_LICENSE_FILES = COPYING
 
+FFTW_CONF_OPTS = --disable-fortran
+
 FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_PRECISION_SINGLE),--enable,--disable)-single
 FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_PRECISION_LONG_DOUBLE),--enable,--disable)-long-double
 FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_PRECISION_QUAD),--enable,--disable)-quad-precision
Signature · 1 line
1.9.1
#8 lore raw

PATCH v6 4/7 package/fftw: disable fortran

Quoted 6 lines · On Mon, 16 Mar 2015 14:54:02 +0100 "Yann E. MORIN" <[email protected]>…

We do not have any fortran package and we do not build a fortran compiler.

Still, an external toolchain may have a fortran compiler and that is totally useless to us, since we anyway have no fortran package...

Quoted 7 lines

So, entirely disable fortran support; that will at least slightly speed up the build in case an external toolchain has a fortran compiler.

[based on a patch by Guillaume]
Cc guillaume william brs <[email protected]>
Cc Gwenhael Goavec-Merou <[email protected]>
Quoted 20 lines
---
 package/fftw/fftw.mk | 2 ++
 1 file changed, 2 insertions(+)
package/fftw/fftw.mk +2 -0
index be99210..333e13b 100644
@@ -10,6 +10,8 @@ FFTW_INSTALL_STAGING = YES
 FFTW_LICENSE = GPLv2+
 FFTW_LICENSE_FILES = COPYING
 
+FFTW_CONF_OPTS = --disable-fortran
+
 FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_PRECISION_SINGLE),--enable,--disable)-single
 FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_PRECISION_LONG_DOUBLE),--enable,--disable)-long-double
 FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_PRECISION_QUAD),--enable,--disable)-quad-precision
Signature · 1 line
1.9.1
#9 lore raw

PATCH v6 5/7 package/fftw: enable threads when the tooclhain has them

In reply to Yann E. MORIN
[based on a patch by Guillaume]
Cc guillaume william brs <[email protected]>
Cc Gwenhael Goavec-Merou <[email protected]>
---
 package/fftw/fftw.mk | 3 +++
 1 file changed, 3 insertions(+)
package/fftw/fftw.mk +3 -0
index 333e13b..a82fca3 100644
@@ -23,4 +23,7 @@ FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_USE_SSE2),--enable,--disable)-sse2
 # ARM optimisations
 FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_USE_NEON),--enable,--disable)-neon
 
+# Generic optimisations
+FFTW_CONF_OPTS += $(if $(BR2_TOOLCHAIN_HAS_THREADS),--enable,--disable)-threads
+
 $(eval $(autotools-package))
Signature · 1 line
1.9.1
#10 lore raw

PATCH v6 5/7 package/fftw: enable threads when the tooclhain has them

Quoted 4 lines · On Mon, 16 Mar 2015 14:54:03 +0100 "Yann E. MORIN" <[email protected]>…
[based on a patch by Guillaume]
Cc guillaume william brs <[email protected]>
Cc Gwenhael Goavec-Merou <[email protected]>
Quoted 19 lines
---
 package/fftw/fftw.mk | 3 +++
 1 file changed, 3 insertions(+)
package/fftw/fftw.mk +3 -0
index 333e13b..a82fca3 100644
@@ -23,4 +23,7 @@ FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_USE_SSE2),--enable,--disable)-sse2
 # ARM optimisations
 FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_USE_NEON),--enable,--disable)-neon
 
+# Generic optimisations
+FFTW_CONF_OPTS += $(if $(BR2_TOOLCHAIN_HAS_THREADS),--enable,--disable)-threads
+
 $(eval $(autotools-package))
Signature · 1 line
1.9.1
#11 lore raw

PATCH v6 6/7 package/fftw: enable OpenMP if the compiler has that

In reply to Yann E. MORIN

Unfortunately, this is limited to internal toolchains; we currently have no way to know if an external toolchain has support for OpenMP.

Cc guillaume william brs <[email protected]>
Cc Gwenhael Goavec-Merou <[email protected]>
---
 package/fftw/fftw.mk | 1 +
 1 file changed, 1 insertion(+)
package/fftw/fftw.mk +1 -0
index a82fca3..c6fe6f0 100644
@@ -25,5 +25,6 @@ FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_USE_NEON),--enable,--disable)-neon
 
 # Generic optimisations
 FFTW_CONF_OPTS += $(if $(BR2_TOOLCHAIN_HAS_THREADS),--enable,--disable)-threads
+FFTW_CONF_OPTS += $(if $(BR2_GCC_ENABLE_OPENMP),--enable-openmp,--disable-openmp)
 
 $(eval $(autotools-package))
Signature · 1 line
1.9.1
#12 lore raw

PATCH v6 6/7 package/fftw: enable OpenMP if the compiler has that

Quoted 6 lines · On Mon, 16 Mar 2015 14:54:04 +0100 "Yann E. MORIN" <[email protected]>…

Unfortunately, this is limited to internal toolchains; we currently have no way to know if an external toolchain has support for OpenMP.

Cc guillaume william brs <[email protected]>
Cc Gwenhael Goavec-Merou <[email protected]>
Quoted 18 lines
---
 package/fftw/fftw.mk | 1 +
 1 file changed, 1 insertion(+)
package/fftw/fftw.mk +1 -0
index a82fca3..c6fe6f0 100644
@@ -25,5 +25,6 @@ FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_USE_NEON),--enable,--disable)-neon
 
 # Generic optimisations
 FFTW_CONF_OPTS += $(if $(BR2_TOOLCHAIN_HAS_THREADS),--enable,--disable)-threads
+FFTW_CONF_OPTS += $(if $(BR2_GCC_ENABLE_OPENMP),--enable-openmp,--disable-openmp)
 
 $(eval $(autotools-package))
Signature · 1 line
1.9.1
#13 lore raw

PATCH v6 7/7 package/fftw: add option for fast maths

In reply to Yann E. MORIN
[based on a patch by Guillaume]
Cc guillaume william brs <[email protected]>
Cc Gwenhael Goavec-Merou <[email protected]>
---
 package/fftw/Config.in | 13 +++++++++++++
 package/fftw/fftw.mk   |  4 ++++
 2 files changed, 17 insertions(+)
package/fftw/Config.in +13 -0
index a0f353c..f088b4c 100644
@@ -58,4 +58,17 @@ config BR2_PACKAGE_FFTW_PRECISION_QUAD
 
 endchoice
 
+config BR2_PACKAGE_FFTW_FAST
+	bool "optimise for speed over accuracy"
+	help
+	  Optimise for fast math functions, at the expense of accuracy.
+
+	  Say 'y' if you need speed and can live with inaccuracies in
+	  the results. Say 'n' (the default) if accuracy is of utmost
+	  importance.
+
+	  This basically uses gcc's -Ofast optimisation level, which in
+	  turn is basically using gcc's -ffast-math. See the gcc manual
+	  for what this means.
+
 endif
package/fftw/fftw.mk +4 -0
index c6fe6f0..6ba4806 100644
@@ -27,4 +27,8 @@ FFTW_CONF_OPTS += $(if $(BR2_PACKAGE_FFTW_USE_NEON),--enable,--disable)-neon
 FFTW_CONF_OPTS += $(if $(BR2_TOOLCHAIN_HAS_THREADS),--enable,--disable)-threads
 FFTW_CONF_OPTS += $(if $(BR2_GCC_ENABLE_OPENMP),--enable-openmp,--disable-openmp)
 
+ifeq ($(BR2_PACKAGE_FFTW_FAST),y)
+FFTW_CONF_OPTS += CFLAGS="$(TARGET_CFLAGS) -Ofast"
+endif
+
 $(eval $(autotools-package))
Signature · 1 line
1.9.1