[PATCH 2/2] selftests/powerpc: benchmarks/context_switch.c use vector instructions/types
Christophe Leroy
christophe.leroy at c-s.fr
Wed Jan 23 19:47:11 AEDT 2019
Hi Cyril,
On 03/03/2016 11:06 PM, Cyril Bur wrote:
> Currently it doesn't appear the resulting binary actually uses any Altivec
> or VSX instructions the solution is to explicitly tell GCC to use vector
> instructions and use vector types in the code.
>
> Part of this this issue can be GCC version specific:
>
> GCC 4.9.x is happy to use Altivec and VSX instructions if altivec.h is
> includedi (and possibly if vector types are used), this also means that
> 4.9.x will use VSX instructions even if only -maltivec is passed. It is
> also possible that Altivec instructions will be used even without -maltivec
> or -mabi=altivec.
>
> GCC 5.2.x complains about the lack of -maltivec parameter if altivec.h is
> included and will not use VSX unless -mvsx is present on commandline.
>
> GCC 5.3.0 has a regression that means __attribute__((__target__("no-vsx"))
> fails to build. A fix is targeted for 5.4.
>
> Furthermore LTO (Link Time Optimisation) doesn't play well with
> __attribute__((__target__("no-vsx")), LTO can cause GCC to forget about the
> attribute and compile with VSX instructions regardless. Be weary when
> enabling -flfo for this test.
>
> Signed-off-by: Cyril Bur <cyrilbur at gmail.com>
This patch breaks the build on my setup:
ppc-linux-gcc -std=gnu99 -O2 -Wall -Werror
-DGIT_VERSION='"v5.0-rc3-560-ge0ce62731d77"'
-I/root/linux-powerpc/tools/testing/selftests/powerpc/include -O2
-maltivec -mvsx -mabi=altivec context_switch.c ../harness.c
../utils.c -lpthread -o
/root/linux-powerpc/tools/testing/selftests/powerpc/benchmarks/context_switch
context_switch.c:1:0: error: -mvsx requires hardware floating point
[-Werror]
/*
^
cc1: all warnings being treated as errors
../harness.c:1:0: error: -mvsx requires hardware floating point [-Werror]
/*
^
cc1: all warnings being treated as errors
../utils.c:1:0: error: -mvsx requires hardware floating point [-Werror]
/*
^
cc1: all warnings being treated as errors
make[1]: ***
[/root/linux-powerpc/tools/testing/selftests/powerpc/benchmarks/context_switch]
Error 1
By removing the -mvsx option, it compiles just fine.
Is that option really required ? According to gcc doc, it is
automatically selected when compiling for cpus that support it.
I'm using:
[root at po16846vm linux-powerpc]# ppc-linux-gcc -v
Using built-in specs.
COLLECT_GCC=ppc-linux-gcc
COLLECT_LTO_WRAPPER=/opt/cldk-1.4.0/libexec/gcc/ppc-linux/5.4.0/lto-wrapper
Target: ppc-linux
Configured with: /root/cldk/gcc-5.4.0/configure --target=ppc-linux
--with-headers=yes --with-cpu=860 --prefix=/opt/cldk-1.4.0
--bindir=/opt/cldk-1.4.0/bin --sbindir=/opt/cldk-1.4.0/sbin
--libexecdir=/opt/cldk-1.4.0/libexec --datadir=/opt/cldk-1.4.0/share
--sysconfdir=/opt/cldk-1.4.0/etc --libdir=/opt/cldk-1.4.0/lib
--includedir=/opt/cldk-1.4.0/usr/include
--oldincludedir=/opt/cldk-1.4.0/usr/include
--infodir=/opt/cldk-1.4.0/share/info --mandir=/opt/cldk-1.4.0/share/man
--with-glibc-version=2.18 --enable-languages=c,c++
Thread model: posix
gcc version 5.4.0 (GCC)
Christophe
> ---
> tools/testing/selftests/powerpc/benchmarks/Makefile | 1 +
> tools/testing/selftests/powerpc/benchmarks/context_switch.c | 11 ++++++++---
> 2 files changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/tools/testing/selftests/powerpc/benchmarks/Makefile b/tools/testing/selftests/powerpc/benchmarks/Makefile
> index 912445f..6816fc2 100644
> --- a/tools/testing/selftests/powerpc/benchmarks/Makefile
> +++ b/tools/testing/selftests/powerpc/benchmarks/Makefile
> @@ -7,6 +7,7 @@ all: $(TEST_PROGS)
> $(TEST_PROGS): ../harness.c
>
> context_switch: ../utils.c
> +context_switch: CFLAGS += -maltivec -mvsx -mabi=altivec
> context_switch: LDLIBS += -lpthread
>
> include ../../lib.mk
> diff --git a/tools/testing/selftests/powerpc/benchmarks/context_switch.c b/tools/testing/selftests/powerpc/benchmarks/context_switch.c
> index e6af382..a36883a 100644
> --- a/tools/testing/selftests/powerpc/benchmarks/context_switch.c
> +++ b/tools/testing/selftests/powerpc/benchmarks/context_switch.c
> @@ -25,7 +25,9 @@
> #include <sys/types.h>
> #include <sys/shm.h>
> #include <linux/futex.h>
> -
> +#ifdef __powerpc__
> +#include <altivec.h>
> +#endif
> #include "../utils.h"
>
> static unsigned int timeout = 30;
> @@ -37,12 +39,15 @@ static int touch_fp = 1;
> double fp;
>
> static int touch_vector = 1;
> -typedef int v4si __attribute__ ((vector_size (16)));
> -v4si a, b, c;
> +vector int a, b, c;
>
> #ifdef __powerpc__
> static int touch_altivec = 1;
>
> +/*
> + * Note: LTO (Link Time Optimisation) doesn't play well with this function
> + * attribute. Be very careful enabling LTO for this test.
> + */
> static void __attribute__((__target__("no-vsx"))) altivec_touch_fn(void)
> {
> c = a + b;
>
More information about the Linuxppc-dev
mailing list