diff options
author | Matthias Kretz <kretz@kde.org> | 2021-01-21 11:50:32 +0000 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2021-01-27 16:37:26 +0000 |
commit | 02e32295b284bd4f4d038e73ee3118fb0546650e (patch) | |
tree | 80f839a9a0e588147cc0da774345a44b4890f25a /libstdc++-v3/scripts | |
parent | 2bcceb6fc59fcdaf51006d4fcfc71c2d26761396 (diff) | |
download | gcc-02e32295b284bd4f4d038e73ee3118fb0546650e.zip gcc-02e32295b284bd4f4d038e73ee3118fb0546650e.tar.gz gcc-02e32295b284bd4f4d038e73ee3118fb0546650e.tar.bz2 |
libstdc++: Add simd testsuite
Add a new check-simd target to the testsuite. The new target creates a
subdirectory, generates the necessary Makefiles, and spawns submakes to
build and run the tests. Running this testsuite with defaults on my
machine takes half of the time the dejagnu testsuite required to only
determine whether to run tests. Since the simd testsuite integrated in
dejagnu increased the time of the whole libstdc++ testsuite by ~100%
this approach is a compromise for speed while not sacrificing coverage
too much. Since the test driver is invoked individually per test
executable from a Makefile, make's jobserver (-j) trivially parallelizes
testing.
Testing different flags and with simulator (or remote execution) is
possible. E.g. `make check-simd DRIVEROPTS=-q
target_list="unix{-m64,-m32}{-march=sandybridge,-march=skylake-avx512}{,-
ffast-math}"`
runs the testsuite 8 times in different subdirectories, using 8
different combinations of compiler flags, only outputs failing tests
(-q), and prints all summaries at the end. It skips most ABI tags by
default unless --run-expensive is passed to DRIVEROPTS or
GCC_TEST_RUN_EXPENSIVE is not empty.
To use a simulator, the CHECK_SIMD_CONFIG variable needs to point to a
shell script which calls `define_target <name> <flags> <simulator>` and
set target_list as needed. E.g.:
case "$target_triplet" in
x86_64-*)
target_list="unix{-march=sandybridge,-march=skylake-avx512}
;;
powerpc64le-*)
define_target power8 "-static -mcpu=power8" "/usr/bin/qemu-ppc64le -cpu
power8"
define_target power9 -mcpu=power9 "$HOME/bin/run_on_gcc135"
target_list="power8 power9{,-ffast-math}"
;;
esac
libstdc++-v3/ChangeLog:
* scripts/check_simd: New file. This script is called from the
the check-simd target. It determines a set of compiler flags and
simulator setups for calling generate_makefile.sh and passes the
information back to the check-simd target, which recurses to the
generated Makefiles.
* scripts/create_testsuite_files: Remove files below simd/tests/
from testsuite_files and place them in testsuite_files_simd.
* testsuite/Makefile.am: Add testsuite_files_simd. Add
check-simd target.
* testsuite/Makefile.in: Regenerate.
* testsuite/experimental/simd/driver.sh: New file. This script
compiles and runs a given simd test, logging its output and
status. It uses the timeout command to implement compile and
test timeouts.
* testsuite/experimental/simd/generate_makefile.sh: New file.
This script generates a Makefile which uses driver.sh to compile
and run the tests and collect the logs into a single log file.
* testsuite/experimental/simd/tests/abs.cc: New file. Tests
abs(simd).
* testsuite/experimental/simd/tests/algorithms.cc: New file.
Tests min/max(simd, simd).
* testsuite/experimental/simd/tests/bits/conversions.h: New
file. Contains functions to support tests involving conversions.
* testsuite/experimental/simd/tests/bits/make_vec.h: New file.
Support functions make_mask and make_vec.
* testsuite/experimental/simd/tests/bits/mathreference.h: New
file. Support functions to supply precomputed math function
reference data.
* testsuite/experimental/simd/tests/bits/metahelpers.h: New
file. Support code for SFINAE testing.
* testsuite/experimental/simd/tests/bits/simd_view.h: New file.
* testsuite/experimental/simd/tests/bits/test_values.h: New
file. Test functions to easily drive a test with simd objects
initialized from a given list of values and a range of random
values.
* testsuite/experimental/simd/tests/bits/ulp.h: New file.
Support code to determine the ULP distance of simd objects.
* testsuite/experimental/simd/tests/bits/verify.h: New file.
Test framework for COMPARE'ing simd objects and instantiating
the test templates with value_type and ABI tag.
* testsuite/experimental/simd/tests/broadcast.cc: New file. Test
simd broadcasts.
* testsuite/experimental/simd/tests/casts.cc: New file. Test
simd casts.
* testsuite/experimental/simd/tests/fpclassify.cc: New file.
Test floating-point classification functions.
* testsuite/experimental/simd/tests/frexp.cc: New file. Test
frexp(simd).
* testsuite/experimental/simd/tests/generator.cc: New file. Test
simd generator constructor.
* testsuite/experimental/simd/tests/hypot3_fma.cc: New file.
Test 3-arg hypot(simd,simd,simd) and fma(simd,simd,sim).
* testsuite/experimental/simd/tests/integer_operators.cc: New
file. Test integer operators.
* testsuite/experimental/simd/tests/ldexp_scalbn_scalbln_modf.cc:
New file. Test ldexp(simd), scalbn(simd), scalbln(simd), and
modf(simd).
* testsuite/experimental/simd/tests/loadstore.cc: New file. Test
(converting) simd loads and stores.
* testsuite/experimental/simd/tests/logarithm.cc: New file. Test
log*(simd).
* testsuite/experimental/simd/tests/mask_broadcast.cc: New file.
Test simd_mask broadcasts.
* testsuite/experimental/simd/tests/mask_conversions.cc: New
file. Test simd_mask conversions.
* testsuite/experimental/simd/tests/mask_implicit_cvt.cc: New
file. Test simd_mask implicit conversions.
* testsuite/experimental/simd/tests/mask_loadstore.cc: New file.
Test simd_mask loads and stores.
* testsuite/experimental/simd/tests/mask_operator_cvt.cc: New
file. Test simd_mask operators convert as specified.
* testsuite/experimental/simd/tests/mask_operators.cc: New file.
Test simd_mask compares, subscripts, and negation.
* testsuite/experimental/simd/tests/mask_reductions.cc: New
file. Test simd_mask reductions.
* testsuite/experimental/simd/tests/math_1arg.cc: New file. Test
1-arg math functions on simd.
* testsuite/experimental/simd/tests/math_2arg.cc: New file. Test
2-arg math functions on simd.
* testsuite/experimental/simd/tests/operator_cvt.cc: New file.
Test implicit conversions on simd binary operators behave as
specified.
* testsuite/experimental/simd/tests/operators.cc: New file. Test
simd compares, subscripts, not, unary minus, plus, minus,
multiplies, divides, increment, and decrement.
* testsuite/experimental/simd/tests/reductions.cc: New file.
Test reduce(simd).
* testsuite/experimental/simd/tests/remqo.cc: New file. Test
remqo(simd).
* testsuite/experimental/simd/tests/simd.cc: New file. Basic
sanity checks of simd types.
* testsuite/experimental/simd/tests/sincos.cc: New file. Test
sin(simd) and cos(simd).
* testsuite/experimental/simd/tests/split_concat.cc: New file.
Test split(simd) and concat(simd, simd).
* testsuite/experimental/simd/tests/splits.cc: New file. Test
split(simd_mask).
* testsuite/experimental/simd/tests/trigonometric.cc: New file.
Test remaining trigonometric functions on simd.
* testsuite/experimental/simd/tests/trunc_ceil_floor.cc: New
file. Test trunc(simd), ceil(simd), and floor(simd).
* testsuite/experimental/simd/tests/where.cc: New file. Test
masked operations using where.
Diffstat (limited to 'libstdc++-v3/scripts')
-rwxr-xr-x | libstdc++-v3/scripts/check_simd | 75 | ||||
-rwxr-xr-x | libstdc++-v3/scripts/create_testsuite_files | 6 |
2 files changed, 80 insertions, 1 deletions
diff --git a/libstdc++-v3/scripts/check_simd b/libstdc++-v3/scripts/check_simd new file mode 100755 index 0000000..25acf64 --- /dev/null +++ b/libstdc++-v3/scripts/check_simd @@ -0,0 +1,75 @@ +#!/bin/sh + +# check_simd <srcdir> <builddir> <CXXFLAGS> +# Read config from $CHECK_SIMD_CONFIG file or $target_list + +scriptdir="$(cd "${0%/*}" && pwd)" +srcdir="$1" +builddir="$2" +shift 2 +testdir="$builddir/testsuite" + +CXX="$("$builddir/scripts/testsuite_flags" --build-cxx)" +CXXFLAGS="$("$builddir/scripts/testsuite_flags" --cxxflags) $1 -Wno-psabi" +shift +INCLUDES="$("$builddir/scripts/testsuite_flags" --build-includes)" + +target_triplet=$($CXX -dumpmachine) + +define_target() { + name="$1" + flags="$2" + sim="$3" + eval "$name=\"flags=\\\"$flags\\\" +sim=\\\"$sim\\\"\"" +} + +if [ -f "$CHECK_SIMD_CONFIG" ]; then + . "$CHECK_SIMD_CONFIG" +elif [ -z "$CHECK_SIMD_CONFIG" ]; then + if [ -z "$target_list" ]; then + target_list="unix" + case "$target_triplet" in + x86_64-*) target_list="unix/-march=native" ;; + i?86-*) target_list="unix/-march=native" ;; + powerpc64le-*) target_list="unix/-mcpu=power8" ;; + aarch64-*) target_list="unix/-mcpu=cortex-a53" ;; + arm-*) target_list="unix/-mcpu=cortex-a7" ;; + esac + fi +else + echo "Error: File not found: \$CHECK_SIMD_CONFIG='$CHECK_SIMD_CONFIG'" 1>&2 + exit 1 +fi + +# define unix with no flags and no simulator: +define_target unix + +list="$target_list" + +# expand a{b,c} to a/b a/c +while [ "${list#*\{}" != "${list}" ]; do + list="$(echo "$list" | \ + sed -e 's#\([^ ]\+\){\([^{},]*\),\([^{}]*\)}\(/[^ ]*\)\?#\1/\2\4 \1{\3}\4#g' \ + -e 's#{\([^{},]*\)}#/\1#g' \ + -e 's#/ # #g' -e 's#/$##')" +done + +# per a/b/c block extract flags and simulator, then make check-simd +while [ ${#list} -gt 0 ]; do + a="${list%% *}" + if [ "$a" = "$list" ]; then + list="" + else + list="${list#${a} }" + fi + b="${a%%/*}" + eval "eval \"\$$b\"" + flags="${flags}$(echo "${a#${b}}"|sed 's#/# #g')" + subdir="simd/$(echo "$flags" | sed 's#[= /-]##g')" + rm -f "${subdir}/Makefile" + $srcdir/testsuite/experimental/simd/generate_makefile.sh \ + --destination="$testdir/$subdir" --sim="$sim" --testflags="$flags" \ + $CXX $INCLUDES $CXXFLAGS -static-libgcc -static-libstdc++ + echo "$subdir" +done diff --git a/libstdc++-v3/scripts/create_testsuite_files b/libstdc++-v3/scripts/create_testsuite_files index 52bbb5c..174c24e 100755 --- a/libstdc++-v3/scripts/create_testsuite_files +++ b/libstdc++-v3/scripts/create_testsuite_files @@ -27,6 +27,7 @@ tmp="${TMPDIR:-/tmp}/ctt$$" tests_file_normal="$outdir/testsuite_files" tests_file_inter="$outdir/testsuite_files_interactive" tests_file_perf="$outdir/testsuite_files_performance" +tests_file_simd="$outdir/testsuite_files_simd" cd $srcdir # This is the ugly version of "everything but the current directory". It's @@ -49,8 +50,11 @@ grep -v _xin $tmp.1 > $tmp.4 grep performance $tmp.4 > $tests_file_perf grep -v performance $tmp.4 > $tmp.5 +grep simd/tests/ $tmp.5 > $tests_file_simd +grep -v simd/tests/ $tmp.5 > $tmp.6 + # ...more filters go here. -cp $tmp.5 $tests_file_normal +cp $tmp.6 $tests_file_normal rm $tmp* exit 0 |