[Libclc-dev] [PATCH 04/15] configure: Add --enable-runtime-subnormal option

Tom Stellard tom at stellard.net
Mon Apr 20 11:51:22 PDT 2015


On Thu, Apr 16, 2015 at 04:59:50PM -0400, Jan Vesely wrote:
> 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

Yes, these functions should all be optimized away.

-Tom

> 
> > ---
> >  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>



> _______________________________________________
> Libclc-dev mailing list
> Libclc-dev at pcc.me.uk
> http://www.pcc.me.uk/cgi-bin/mailman/listinfo/libclc-dev





More information about the Libclc-dev mailing list