[Libclc-dev] [PATCH 04/15] configure: Add --enable-runtime-subnormal option
Jan Vesely
jan.vesely at rutgers.edu
Thu Apr 16 13:59:50 PDT 2015
On Tue, 2015-04-07 at 18:05 +0000, Tom Stellard wrote:
> This makes it possible for runtime implementations to disable
> subnormal handling at runtime.
>
> When this flag is enabled, decisions about how to handle subnormals
> in the library will be controlled by an external variable called
> __CLC_SUBNORMAL_DISABLE.
>
> Function implementations should use these new helpers for querying subnormal
> support:
> __clc_fp16_subnormals_supported();
> __clc_fp32_subnormals_supported();
> __clc_fp64_subnormals_supported();
>
> In order for the library to link correctly with this feature,
> users will be required to either:
>
> 1. Insert this variable into the module (if using the LLVM/Clang C++/C APIs).
>
> 2. Pass either subnormal_disable.bc or subnormal_use_default.bc to the
> linker. These files are distributed with liblclc and installed to
> $(installdir). e.g.:
>
> llvm-link -o kernel-out.bc kernel.bc builtins-nosubnormal.bc subnormal_disable.bc
>
> or
>
> llvm-link -o kernel-out.bc kernel.bc builtins-nosubnormal.bc subnormal_use_default.bc
>
> If you do not supply the --enable-runtime-subnormal then the library
> behaves the same as it did before this commit.
>
> In addition to these changes, the patch adds helper functions that
> should be used when implementing library functions that need
> special handling for denormals:
>
> __clc_fp16_subnormals_supported();
> __clc_fp32_subnormals_supported();
> __clc_fp64_subnormals_supported();
I assume that the alternative branch gets DCEd during linking.
If so it's much nicer than any macro/build time solution.
LGTM
> ---
> configure.py | 16 ++++++++++++++++
> generic/include/config.h | 26 +++++++++++++++++++++++++
> generic/lib/SOURCES | 2 ++
> generic/lib/subnormal_config.cl | 37 ++++++++++++++++++++++++++++++++++++
> generic/lib/subnormal_disable.ll | 1 +
> generic/lib/subnormal_helper_func.ll | 8 ++++++++
> generic/lib/subnormal_use_default.ll | 1 +
> 7 files changed, 91 insertions(+)
> create mode 100644 generic/include/config.h
> create mode 100644 generic/lib/subnormal_config.cl
> create mode 100644 generic/lib/subnormal_disable.ll
> create mode 100644 generic/lib/subnormal_helper_func.ll
> create mode 100644 generic/lib/subnormal_use_default.ll
>
> diff --git a/configure.py b/configure.py
> index 602165b..7d4b537 100755
> --- a/configure.py
> +++ b/configure.py
> @@ -34,6 +34,8 @@ p.add_option('--pkgconfigdir', metavar='PATH',
> help='install clc.pc to given dir')
> p.add_option('-g', metavar='GENERATOR', default='make',
> help='use given generator (default: make)')
> +p.add_option('--enable-runtime-subnormal', action="store_true", default=False,
> + help='Allow runtimes to choose subnormal support')
> (options, args) = p.parse_args()
>
> llvm_config_exe = options.with_llvm_config or "llvm-config"
> @@ -133,6 +135,16 @@ manifest_deps = set([sys.argv[0], os.path.join(srcdir, 'build', 'metabuild.py'),
> install_files_bc = []
> install_deps = []
>
> +# Create rules for subnormal helper objects
> +for src in ['subnormal_disable.ll', 'subnormal_use_default.ll']:
> + obj_name = src[:-2] + 'bc'
> + obj = os.path.join('generic--', 'lib', obj_name)
> + src_file = os.path.join('generic', 'lib', src)
> + b.build(obj, 'LLVM_AS', src_file)
> + b.default(obj)
> + install_files_bc.append((obj, obj))
> + install_deps.append(obj)
> +
> # Create libclc.pc
> clc = open('libclc.pc', 'w')
> clc.write('includedir=%(inc)s\nlibexecdir=%(lib)s\n\nName: libclc\nDescription: Library requirements of the OpenCL C programming language\nVersion: %(maj)s.%(min)s.%(pat)s\nCflags: -I${includedir}\nLibs: -L${libexecdir}' %
> @@ -209,6 +221,10 @@ for target in targets:
> else:
> b.build(obj, clang_bc_rule, src_file)
>
> + obj = os.path.join('generic--', 'lib', 'subnormal_use_default.bc')
> + if not options.enable_runtime_subnormal:
> + objects.append(obj)
> +
> builtins_link_bc = os.path.join(target, 'lib', 'builtins.link' + obj_suffix + '.bc')
> builtins_opt_bc = os.path.join(target, 'lib', 'builtins.opt' + obj_suffix + '.bc')
> builtins_bc = os.path.join('built_libs', full_target_name + '.bc')
> diff --git a/generic/include/config.h b/generic/include/config.h
> new file mode 100644
> index 0000000..2994199
> --- /dev/null
> +++ b/generic/include/config.h
> @@ -0,0 +1,26 @@
> +/*
> + * Copyright (c) 2015 Advanced Micro Devices, Inc.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a copy
> + * of this software and associated documentation files (the "Software"), to deal
> + * in the Software without restriction, including without limitation the rights
> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> + * copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> + * THE SOFTWARE.
> + */
> +
> +_CLC_DECL bool __clc_subnormals_disabled();
> +_CLC_DECL bool __clc_fp16_subnormals_supported();
> +_CLC_DECL bool __clc_fp32_subnormals_supported();
> +_CLC_DECL bool __clc_fp64_subnormals_supported();
> diff --git a/generic/lib/SOURCES b/generic/lib/SOURCES
> index a4a017a..d7caa78 100644
> --- a/generic/lib/SOURCES
> +++ b/generic/lib/SOURCES
> @@ -1,3 +1,5 @@
> +subnormal_config.cl
> +subnormal_helper_func.ll
> async/async_work_group_copy.cl
> async/async_work_group_strided_copy.cl
> async/prefetch.cl
> diff --git a/generic/lib/subnormal_config.cl b/generic/lib/subnormal_config.cl
> new file mode 100644
> index 0000000..4bcecfd
> --- /dev/null
> +++ b/generic/lib/subnormal_config.cl
> @@ -0,0 +1,37 @@
> +/*
> + * Copyright (c) 2015 Advanced Micro Devices, Inc.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a copy
> + * of this software and associated documentation files (the "Software"), to deal
> + * in the Software without restriction, including without limitation the rights
> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> + * copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> + * THE SOFTWARE.
> + */
> +
> +#include <clc/clc.h>
> +
> +#include "config.h"
> +
> +_CLC_DEF bool __clc_fp16_subnormals_supported() {
> + return false;
> +}
> +
> +_CLC_DEF bool __clc_fp32_subnormals_supported() {
> + return false;
> +}
> +
> +_CLC_DEF bool __clc_fp64_subnormals_supported() {
> + return !__clc_subnormals_disabled();
> +}
> diff --git a/generic/lib/subnormal_disable.ll b/generic/lib/subnormal_disable.ll
> new file mode 100644
> index 0000000..b935583
> --- /dev/null
> +++ b/generic/lib/subnormal_disable.ll
> @@ -0,0 +1 @@
> + at __CLC_SUBNORMAL_DISABLE = unnamed_addr constant i1 true
> diff --git a/generic/lib/subnormal_helper_func.ll b/generic/lib/subnormal_helper_func.ll
> new file mode 100644
> index 0000000..fb1b5d2
> --- /dev/null
> +++ b/generic/lib/subnormal_helper_func.ll
> @@ -0,0 +1,8 @@
> + at __CLC_SUBNORMAL_DISABLE = external global i1
> +
> +define i1 @__clc_subnormals_disabled() #0 {
> + %disable = load i1, i1* @__CLC_SUBNORMAL_DISABLE
> + ret i1 %disable
> +}
> +
> +attributes #0 = { alwaysinline }
> diff --git a/generic/lib/subnormal_use_default.ll b/generic/lib/subnormal_use_default.ll
> new file mode 100644
> index 0000000..d70c63b
> --- /dev/null
> +++ b/generic/lib/subnormal_use_default.ll
> @@ -0,0 +1 @@
> + at __CLC_SUBNORMAL_DISABLE = unnamed_addr constant i1 false
--
Jan Vesely <jan.vesely at rutgers.edu>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part
URL: <http://lists.llvm.org/pipermail/libclc-dev/attachments/20150416/2dd96264/attachment.sig>
More information about the Libclc-dev
mailing list