From patchwork Tue Dec 2 17:14:51 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Senkevich X-Patchwork-Id: 4035 Received: (qmail 9896 invoked by alias); 2 Dec 2014 17:15:29 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 9881 invoked by uid 89); 2 Dec 2014 17:15:27 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-qc0-f175.google.com X-Received: by 10.112.150.102 with SMTP id uh6mr356327lbb.50.1417540522098; Tue, 02 Dec 2014 09:15:22 -0800 (PST) MIME-Version: 1.0 From: Andrew Senkevich Date: Tue, 2 Dec 2014 21:14:51 +0400 Message-ID: Subject: [PATCH 9/N v2] [x86_64] Vectorized math functions To: libc-alpha This is addition of tests for vectorized function cos. 2014-12-02 Andrew Senkevich * math/Makefile: Added rules for tests. * sysdeps/x86_64/fpu/Makefile: Likewise. * math/test-double-vlen2.h: New file. * math/test-double-vlen4.h: New file. * sysdeps/x86_64/fpu/test-double-vlen2.c: New file. * sysdeps/x86_64/fpu/test-double-vlen4-avx2.c: New file. * sysdeps/x86_64/fpu/test-double-vlen4.c: New file. * sysdeps/x86_64/fpu/math-tests-arch.h: AVX2 availability runtime check set up. * sysdeps/x86_64/fpu/libm-test-ulps: Regenarated. --- WBR, Andrew diff --git a/math/Makefile b/math/Makefile index a77687e..7478824 100644 --- a/math/Makefile +++ b/math/Makefile @@ -114,8 +114,9 @@ tests-static = test-fpucw-static test-fpucw-ieee-static test-longdouble-yes = test-ldouble test-ildoubl ifneq (no,$(PERL)) +libm-vec-tests = $(addprefix test-,$(libmvec-tests)) libm-tests = test-float test-double $(test-longdouble-$(long-double-fcts)) \ - test-ifloat test-idouble + test-ifloat test-idouble $(libm-vec-tests) libm-tests.o = $(addsuffix .o,$(libm-tests)) tests += $(libm-tests) @@ -142,8 +143,22 @@ $(objpfx)test-double.o: $(objpfx)libm-test.stmp $(objpfx)test-idouble.o: $(objpfx)libm-test.stmp $(objpfx)test-ldouble.o: $(objpfx)libm-test.stmp $(objpfx)test-ildoubl.o: $(objpfx)libm-test.stmp + +$(objpfx)test-double-vlen2.o: $(objpfx)libm-test.stmp +$(objpfx)test-double-vlen4.o: $(objpfx)libm-test.stmp + +$(objpfx)test-double-vlen2: $(common-objpfx)mathvec/libmvec.so \ + $(objpfx)init-arch.o +$(objpfx)test-double-vlen4: $(common-objpfx)mathvec/libmvec.so \ + $(objpfx)init-arch.o endif +CFLAGS-test-double-vlen2.c = -fno-inline -ffloat-store -fno-builtin -frounding-math \ + -D__FAST_MATH__ -DTEST_FAST_MATH -D_OPENMP=201307 \ + -Wno-unknown-pragmas +CFLAGS-test-double-vlen4.c = -fno-inline -ffloat-store -fno-builtin -frounding-math \ + -D__FAST_MATH__ -DTEST_FAST_MATH -D_OPENMP=201307 \ + -Wno-unknown-pragmas $(arch-ext-cflags) CFLAGS-test-float.c = -fno-inline -ffloat-store -fno-builtin -frounding-math CFLAGS-test-double.c = -fno-inline -ffloat-store -fno-builtin -frounding-math CFLAGS-test-ldouble.c = -fno-inline -ffloat-store -fno-builtin -frounding-math diff --git a/math/test-double-vlen2.h b/math/test-double-vlen2.h new file mode 100644 index 0000000..ca0e4a5 --- /dev/null +++ b/math/test-double-vlen2.h @@ -0,0 +1,56 @@ +/* Copyright (C) 2014 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#define FLOAT double +#define FUNC(function) function +#define TEST_MSG "testing double vector math (without inline functions)\n" +#define MATHCONST(x) x +#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Cdouble +#define PRINTF_EXPR "e" +#define PRINTF_XEXPR "a" +#define PRINTF_NEXPR "f" +#define TEST_DOUBLE 1 +#define TEST_MATHVEC 1 + +#ifndef __NO_MATH_INLINES +# define __NO_MATH_INLINES +#endif + +#define EXCEPTION_TESTS_double 0 +#define ROUNDING_TESTS_double(MODE) ((MODE) == FE_TONEAREST) + +#define VEC_SUFF _vlen2 + +#define CONCAT(a, b) __CONCAT (a, b) + +#define WRAPPER_NAME(function) CONCAT (function, VEC_SUFF) + +#define FUNC_TEST(function) function ## _VEC_SUFF + +#define TEST_VEC_LOOP(len) \ + do \ + { \ + for (i=1; i. */ + +#define FLOAT double +#define FUNC(function) function +#define TEST_MSG "testing double vector math (without inline functions)\n" +#define MATHCONST(x) x +#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Cdouble +#define PRINTF_EXPR "e" +#define PRINTF_XEXPR "a" +#define PRINTF_NEXPR "f" +#define TEST_DOUBLE 1 +#define TEST_MATHVEC 1 + +#ifndef __NO_MATH_INLINES +# define __NO_MATH_INLINES +#endif + +#define EXCEPTION_TESTS_double 0 +#define ROUNDING_TESTS_double(MODE) ((MODE) == FE_TONEAREST) + +#define CONCAT(a, b) __CONCAT (a, b) + +#define WRAPPER_NAME(function) CONCAT (function, VEC_SUFF) + +#define FUNC_TEST(function) function ## _VEC_SUFF + +#define TEST_VEC_LOOP(len) \ + do \ + { \ + for (i=1; i. */ + +#include "test-double-vlen2.h" +#include + + + +// Wrapper from scalar to vector function implemented in SSE4. +#define VECTOR_WRAPPER(scalar_func, vector_func) \ +extern __m128d vector_func (__m128d); \ +FLOAT scalar_func (FLOAT x) \ +{ \ + int i; \ + __m128d mx = _mm_set1_pd (x); \ + __m128d mr = vector_func (mx); \ + TEST_VEC_LOOP(2); \ +} + +VECTOR_WRAPPER (WRAPPER_NAME (cos), _ZGVbN2v_cos) + +#define TEST_VECTOR_cos 1 + +#include "libm-test.c" diff --git a/sysdeps/x86_64/fpu/test-double-vlen4-avx2.c b/sysdeps/x86_64/fpu/test-double-vlen4-avx2.c new file mode 100644 index 0000000..0bf0be1 --- /dev/null +++ b/sysdeps/x86_64/fpu/test-double-vlen4-avx2.c @@ -0,0 +1,41 @@ +/* Tests for AVX2 ISA versions of vector math functions. + Copyright (C) 2014 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include "test-double-vlen4.h" +#include + +// Wrapper from scalar to vector function implemented in AVX2. +#define VECTOR_WRAPPER(scalar_func, vector_func) \ +extern __m256d vector_func (__m256d); \ +FLOAT scalar_func (FLOAT x) \ +{ \ + int i; \ + __m256d mx = _mm256_set1_pd (x); \ + __m256d mr = vector_func (mx); \ + TEST_VEC_LOOP(4); \ +} + +#define VEC_SUFF _vlen4_avx2 + +VECTOR_WRAPPER (WRAPPER_NAME (cos), _ZGVdN4v_cos) + +#define TEST_VECTOR_cos 1 + +#define REQUIRE_AVX2 + +#include "libm-test.c" diff --git a/sysdeps/x86_64/fpu/test-double-vlen4.c b/sysdeps/x86_64/fpu/test-double-vlen4.c new file mode 100644 index 0000000..fd289ad --- /dev/null +++ b/sysdeps/x86_64/fpu/test-double-vlen4.c @@ -0,0 +1,39 @@ +/* Tests for AVX ISA versions of vector math functions. + Copyright (C) 2014 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include "test-double-vlen4.h" +#include + +// Wrapper from scalar to vector function implemented in AVX. +#define VECTOR_WRAPPER(scalar_func, vector_func) \ +extern __m256d vector_func (__m256d); \ +FLOAT scalar_func (FLOAT x) \ +{ \ + int i; \ + __m256d mx = _mm256_set1_pd (x); \ + __m256d mr = vector_func (mx); \ + TEST_VEC_LOOP(4); \ +} + +#define VEC_SUFF _vlen4_avx + +VECTOR_WRAPPER (WRAPPER_NAME (cos), _ZGVcN4v_cos) + +#define TEST_VECTOR_cos 1 + +#include "libm-test.c" diff --git a/sysdeps/x86_64/fpu/math-tests-arch.h b/sysdeps/x86_64/fpu/math-tests-arch.h new file mode 100644 index 0000000..4c2f372 --- /dev/null +++ b/sysdeps/x86_64/fpu/math-tests-arch.h @@ -0,0 +1,43 @@ +/* Runtime architecture check for math tests. x86_64 version. + Copyright (C) 2013-2014 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifdef REQUIRE_AVX2 +# include + + /* Set to 1 if AVX2 supported. */ + static int avx2_usable; + +# define INIT_ARCH_EXT \ + do \ + { \ + __init_cpu_features (); \ + avx2_usable = __cpu_features.feature[index_AVX2_Usable] \ + & bit_AVX2_Usable; \ + } \ + while (0) + +# define CHECK_ARCH_EXT \ + do \ + { \ + if (!avx2_usable) return; \ + } \ + while (0) + +#else +# include +#endif