Message ID | 20210512092922.901289-1-naohirot@fujitsu.com |
---|---|
State | New |
Headers | show |
Series | aarch64: Added optimized memcpy/memmove/memset for A64FX | expand |
On Wed, 12 May 2021, Naohiro Tamura wrote: > From: Naohiro Tamura <naohirot@jp.fujitsu.com> > > This patch is a test helper script to change Vector Length for child > process. This script can be used as test-wrapper for 'make check'. This is specific to AArch64, so I think it would better go under sysdeps/unix/sysv/linux/aarch64/ rather than under scripts/. There is also the question of how to make this discoverable to people developing glibc. Maybe this script should be mentioned in install.texi (with INSTALL regenerated accordingly), with the documentation there clearly explaining that it's specific to AArch64 GNU/Linux.
Hi Joseph, Thank you for the review. > From: Joseph Myers <joseph@codesourcery.com> > > This patch is a test helper script to change Vector Length for child > > process. This script can be used as test-wrapper for 'make check'. > > This is specific to AArch64, so I think it would better go under > sysdeps/unix/sysv/linux/aarch64/ rather than under scripts/. OK, I moved it to sysdeps/unix/sysv/linux/aarch64/. > There is also the question of how to make this discoverable to people developing > glibc. Maybe this script should be mentioned in install.texi (with INSTALL > regenerated accordingly), with the documentation there clearly explaining that it's > specific to AArch64 GNU/Linux. OK, I updated install.texi, INSTALL, vlset.py doc part as well as commit message such as the followings or my github [1]. [1] https://github.com/NaohiroTamura/glibc/commit/37a5832fea109ab939ffdf58a2a19d5707849cc5 [commit message] aarch64: Added Vector Length Set test helper script This patch is a test helper script to change Vector Length for child process. This script can be used as test-wrapper for 'make check'. Usage examples: ~/build$ make check subdirs=string \ test-wrapper='~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 16' ~/build$ ~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 16 \ make test t=string/test-memcpy ~/build$ ~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 32 \ ./debugglibc.sh string/test-memmove ~/build$ ~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 64 \ ./testrun.sh string/test-memset --- INSTALL | 4 ++ manual/install.texi | 3 + sysdeps/unix/sysv/linux/aarch64/vltest.py | 82 +++++++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100755 sysdeps/unix/sysv/linux/aarch64/vltest.py diff --git a/INSTALL b/INSTALL index 065a568585..bc761ab98b 100644 --- a/INSTALL +++ b/INSTALL @@ -380,6 +380,10 @@ the same syntax as 'test-wrapper-env', the only difference in its semantics being starting with an empty set of environment variables rather than the ambient set. + For AArch64 with SVE, when testing the GNU C Library, 'test-wrapper' +may be set to "SRCDIR/sysdeps/unix/sysv/linux/aarch64/vltest.py +VECTOR-LENGTH" to change Vector Length. + Installing the C Library ======================== diff --git a/manual/install.texi b/manual/install.texi index eb41fbd0b5..f1d858fb78 100644 --- a/manual/install.texi +++ b/manual/install.texi @@ -418,6 +418,9 @@ use has the same syntax as @samp{test-wrapper-env}, the only difference in its semantics being starting with an empty set of environment variables rather than the ambient set. +For AArch64 with SVE, when testing @theglibc{}, @samp{test-wrapper} +may be set to "@var{srcdir}/sysdeps/unix/sysv/linux/aarch64/vltest.py +@var{vector-length}" to change Vector Length. @node Running make install @appendixsec Installing the C Library diff --git a/sysdeps/unix/sysv/linux/aarch64/vltest.py b/sysdeps/unix/sysv/linux/aarch64/vltest.py new file mode 100755 index 0000000000..bed62ad151 --- /dev/null +++ b/sysdeps/unix/sysv/linux/aarch64/vltest.py @@ -0,0 +1,82 @@ +#!/usr/bin/python3 +# Set Scalable Vector Length test helper +# Copyright (C) 2021 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 +# <https://www.gnu.org/licenses/>. +"""Set Scalable Vector Length test helper. + +Set Scalable Vector Length for child process. + +examples: + +~/build$ make check subdirs=string \ +test-wrapper='~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 16' + +~/build$ ~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 16 \ +make test t=string/test-memcpy + +~/build$ ~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 32 \ +./debugglibc.sh string/test-memmove + +~/build$ ~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 64 \ +./testrun.sh string/test-memset +""" Thanks. Naohiro
diff --git a/scripts/vltest.py b/scripts/vltest.py new file mode 100755 index 0000000000..264dfa449f --- /dev/null +++ b/scripts/vltest.py @@ -0,0 +1,82 @@ +#!/usr/bin/python3 +# Set Scalable Vector Length test helper +# Copyright (C) 2019-2021 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 +# <https://www.gnu.org/licenses/>. +"""Set Scalable Vector Length test helper. + +Set Scalable Vector Length for child process. + +examples: + +ubuntu@bionic:~/build$ make check subdirs=string \ +test-wrapper='~/glibc/scripts/vltest.py 16' + +ubuntu@bionic:~/build$ ~/glibc/scripts/vltest.py 16 make test \ +t=string/test-memcpy + +ubuntu@bionic:~/build$ ~/glibc/scripts/vltest.py 32 ./debugglibc.sh \ +string/test-memmove + +ubuntu@bionic:~/build$ ~/glibc/scripts/vltest.py 64 ./testrun.sh \ +string/test-memset +""" +import argparse +from ctypes import cdll, CDLL +import os +import sys + +EXIT_SUCCESS = 0 +EXIT_FAILURE = 1 +EXIT_UNSUPPORTED = 77 + +AT_HWCAP = 16 +HWCAP_SVE = (1 << 22) + +PR_SVE_GET_VL = 51 +PR_SVE_SET_VL = 50 +PR_SVE_SET_VL_ONEXEC = (1 << 18) +PR_SVE_VL_INHERIT = (1 << 17) +PR_SVE_VL_LEN_MASK = 0xffff + +def main(args): + libc = CDLL("libc.so.6") + if not libc.getauxval(AT_HWCAP) & HWCAP_SVE: + print("CPU doesn't support SVE") + sys.exit(EXIT_UNSUPPORTED) + + libc.prctl(PR_SVE_SET_VL, + args.vl[0] | PR_SVE_SET_VL_ONEXEC | PR_SVE_VL_INHERIT) + os.execvp(args.args[0], args.args) + print("exec system call failure") + sys.exit(EXIT_FAILURE) + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description= + "Set Scalable Vector Length test helper", + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + # positional argument + parser.add_argument("vl", nargs=1, type=int, + choices=range(16, 257, 16), + help=('vector length '\ + 'which is multiples of 16 from 16 to 256')) + # remainDer arguments + parser.add_argument('args', nargs=argparse.REMAINDER, + help=('args '\ + 'which is passed to child process')) + args = parser.parse_args() + main(args)
From: Naohiro Tamura <naohirot@jp.fujitsu.com> This patch is a test helper script to change Vector Length for child process. This script can be used as test-wrapper for 'make check'. Usage examples: ubuntu@bionic:~/build$ make check subdirs=string \ test-wrapper='~/glibc/scripts/vltest.py 16' ubuntu@bionic:~/build$ ~/glibc/scripts/vltest.py 16 make test \ t=string/test-memcpy ubuntu@bionic:~/build$ ~/glibc/scripts/vltest.py 32 ./debugglibc.sh \ string/test-memmove ubuntu@bionic:~/build$ ~/glibc/scripts/vltest.py 64 ./testrun.sh string/test-memset --- scripts/vltest.py | 82 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100755 scripts/vltest.py