|
- # Ordered As per https://netlib.org/blas/blasqr.pdf
- # NOTE: xROTG xROTMG xROTM have no kernels?
- # TODO: Actually test and set this
- if true
- fma3_flag = '-mfma'
- endif
- # TODO: This is currently following x86_64 generic for src and dir, but it needs
- # to diversify
- # NOTE: The def and undefs are from Makefile.L1
- # Construct all ModesymbKERNEL from src and dir via files(dir + src)
- # For the modes array, the following mapping is used for c_args:
- # addl --> passed AS IS
- base_kops = [
- # Level 1 BLAS
- { 'base': '?rot',
- 'modes': {
- 's': {'exts': {'_k': {'dir': 'arm', 'kernel': 'rot.c', 'addl': [fma3_flag]}}},
- 'd': {'exts': {'_k': {'dir': 'arm', 'kernel': 'rot.c', 'addl': [fma3_flag]}}},
- 'q': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zrot.c'}}},
- 'cs': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zrot.c'}}},
- 'zd': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zrot.c'}}},
- 'xq': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zrot.c'}}},
- },
- },
- { 'base': '?swap',
- 'modes': {
- 's': {'exts': {'_k': {'dir': 'arm', 'kernel': 'swap.c'}}},
- 'd': {'exts': {'_k': {'dir': 'arm', 'kernel': 'swap.c'}}},
- 'q': {'exts': {'_k': {'dir': 'x86_64', 'kernel': 'swap.S'}}},
- 'c': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zswap.c'}}},
- 'z': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zswap.c'}}},
- 'x': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zswap.c'}}},
- },
- },
- { 'base': '?scal',
- 'modes': {
- 's': {'exts': {'_k': {'dir': 'arm', 'kernel': 'scal.c'}}},
- 'd': {'exts': {'_k': {'dir': 'arm', 'kernel': 'scal.c'}}},
- 'q': {'exts': {'_k': {'dir': 'x86_64', 'kernel': 'scal.S'}}},
- 'c': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zscal.c'}}},
- 'z': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zscal.c'}}},
- 'x': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zscal.c'}}},
- },
- },
- { 'base': '?copy',
- 'modes': {
- 's': {'exts': {'_k': {'dir': 'arm', 'kernel': 'copy.c'}}},
- 'd': {'exts': {'_k': {'dir': 'arm', 'kernel': 'copy.c'}}},
- 'q': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zcopy.c'}}},
- 'c': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zcopy.c'}}},
- 'z': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zcopy.c'}}},
- 'x': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zcopy.c'}}},
- },
- },
- { 'base': '?axpy',
- 'modes': {
- 's': {'exts': {'_k': {'dir': 'arm', 'kernel': 'axpy.c'}}},
- 'd': {'exts': {'_k': {'dir': 'arm', 'kernel': 'axpy.c'}}},
- 'q': {'exts': {'_k': {'dir': 'x86_64', 'kernel': 'axpy.S'}}},
- 'c': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zaxpy.c'}}},
- 'z': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zaxpy.c'}}},
- 'x': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zaxpy.c'}}},
- },
- },
- { 'base': '?dot',
- 'modes': {
- 's': {'exts': {'_k': {'dir': 'arm', 'kernel': 'dot.c'}}},
- 'd': {'exts': {'_k': {'dir': 'arm', 'kernel': 'dot.c'}}},
- 'q': {'exts': {'_k': {'dir': 'x86_64', 'kernel': 'dot.S'}}},
- 'c': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zdot.c'}}},
- 'z': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zdot.c'}}},
- 'x': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zdot.c'}}},
- },
- },
- # xDOTU xDOTC xxDOT aren't present
- { 'base': '?nrm2',
- 'modes': {
- 's': {'exts': {'_k': {'dir': 'arm', 'kernel': 'nrm2.c'}}},
- 'd': {'exts': {'_k': {'dir': 'arm', 'kernel': 'nrm2.c'}}},
- 'q': {'exts': {'_k': {'dir': 'arm', 'kernel': 'znrm2.c'}}},
- 'c': {'exts': {'_k': {'dir': 'arm', 'kernel': 'znrm2.c'}}},
- 'z': {'exts': {'_k': {'dir': 'arm', 'kernel': 'znrm2.c'}}},
- 'x': {'exts': {'_k': {'dir': 'arm', 'kernel': 'znrm2.c'}}},
- },
- },
- { 'base': '?asum',
- 'modes': {
- 's': {'exts': {'_k': {'dir': 'arm', 'kernel': 'asum.c'}}},
- 'd': {'exts': {'_k': {'dir': 'arm', 'kernel': 'asum.c'}}},
- 'q': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zasum.c'}}},
- 'c': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zasum.c'}}},
- 'z': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zasum.c'}}},
- 'x': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zasum.c'}}},
- },
- },
- { 'base': '?amax',
- 'modes': {
- 's': {'exts': {'_k': {'dir': 'arm', 'kernel': 'amax.c'}}},
- 'd': {'exts': {'_k': {'dir': 'arm', 'kernel': 'amax.c'}}},
- 'q': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zamax.c'}}},
- 'c': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zamax.c'}}},
- 'z': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zamax.c'}}},
- 'x': {'exts': {'_k': {'dir': 'arm', 'kernel': 'zamax.c'}}},
- },
- },
- # TODO: Handle the i*amax style
- { 'base': '?axpby',
- 'modes': {
- 's': {'exts': {'_k': {'dir': 'arm', 'kernel': 'axpby.c'}}},
- 'd': {'exts': {'_k': {'dir': 'arm', 'kernel': 'axpby.c'}}},
- 'c': {'exts': {'_k': {'dir': 'x86_64', 'kernel': 'zaxpy_sse.S'}}},
- 'z': {'exts': {'_k': {'dir': 'x86_64', 'kernel': 'zaxpy_sse2.S'}}},
- },
- },
- # # # Level 2 BLAS
- # # # There are additional sources so now we have srcs
- # # # Ordered as per KERNEL.generic and Makefile.L2
- # # # exts are used to find the flags for each modality
- # # # ext is attached to base (only useful from Level 2)
- # # # i.e. baseext (e.g., gemv_n, gemv_t, cgeru_k, cgerc_k)
- # # {'base': 'gemv',
- # # 'modes': {'s': {'dir': 'arm', 'kernel': 'gemv_n.c', 'exts': ['_n', '_t']},
- # # 'd': {'dir': 'arm', 'kernel': 'gemv_n.c',
- # # # TODO: _t should take fmaflag, but then we need a dictionary..
- # # # From Makefile.L2
- # # 'exts': ['_n', '_t']},
- # # 'q': {'dir': 'arm', 'kernel': 'gemv_n.c', 'exts': ['_n', '_t']},
- # # 'c': {'dir': 'arm', 'kernel': 'zgemv_n.c',
- # # 'exts': ['_n', '_t', '_r', '_c', '_o', '_u', '_s', '_d']},
- # # 'z': {'dir': 'arm', 'kernel': 'zgemv_n.c',
- # # 'exts': ['_n', '_t', '_r', '_c', '_o', '_u', '_s', '_d']},
- # # 'x': {'dir': 'arm', 'kernel': 'zgemv_n.c',
- # # 'exts': ['_n', '_t', '_r', '_c', '_o', '_u', '_s', '_d']},
- # # },
- # # },
- # # {'base': 'symv',
- # # 'modes': {'s': {'dir': 'generic', 'kernel': 'symv_k.c', 'exts': ['_U', '_L']},
- # # 'd': {'dir': 'generic', 'kernel': 'symv_k.c', 'exts': ['_U', '_L']},
- # # 'q': {'dir': 'generic', 'kernel': 'symv_k.c', 'exts': ['_U', '_L']},
- # # 'c': {'dir': 'generic', 'kernel': 'symv_k.c', 'exts': ['_U', '_L']},
- # # 'z': {'dir': 'generic', 'kernel': 'symv_k.c', 'exts': ['_U', '_L']},
- # # 'x': {'dir': 'generic', 'kernel': 'symv_k.c', 'exts': ['_U', '_L']},
- # # },
- # # },
- # # {'base': 'ger',
- # # 'modes': {'s': {'dir': 'generic', 'kernel': 'ger.c', 'exts': ['_k']},
- # # 'd': {'dir': 'generic', 'kernel': 'ger.c', 'exts': ['_k']},
- # # 'q': {'dir': 'generic', 'kernel': 'ger.c', 'exts': ['_k']}
- # # },
- # # },
- # # {'base': 'geru',
- # # 'modes': {'c': {'dir': 'generic', 'kernel': 'zger.c', 'exts': ['_k']},
- # # 'z': {'dir': 'generic', 'kernel': 'zger.c', 'exts': ['_k']},
- # # 'x': {'dir': 'generic', 'kernel': 'zger.c', 'exts': ['_k']}
- # # }
- # # },
- # # {'base': 'gerc',
- # # 'modes': {'c': {'dir': 'generic', 'kernel': 'zger.c', 'exts': ['_k']},
- # # 'z': {'dir': 'generic', 'kernel': 'zger.c', 'exts': ['_k']},
- # # 'x': {'dir': 'generic', 'kernel': 'zger.c', 'exts': ['_k']},
- # # },
- # # },
- # # {'base': 'hemv',
- # # 'modes': {'c': {'dir': 'generic',
- # # 'kernel': 'zhemv_k.c',
- # # 'exts': ['_U', '_L', '_V', '_M']},
- # # 'z': {'dir': 'generic',
- # # 'kernel': 'zhemv_k.c',
- # # 'exts': ['_U', '_L', '_V', '_M']},
- # # 'x': {'dir': 'generic',
- # # 'kernel': 'zhemv_k.c',
- # # 'exts': ['_U', '_L', '_V', '_M']},
- # # },
- # # },
- # # {'base': 'bgemv',
- # # 'modes': {'s': {'dir': 'x86_64',
- # # 'kernel': 'sbgemv_n.c',
- # # 'exts': ['_n', '_t']}
- # # },
- # # },
- ]
-
- kernel_confs = []
- foreach _kop : base_kops
- base = _kop['base']
- modes = _kop['modes']
- foreach mode, details : modes
- __cargs = _cargs
- prec_mode = precision_mappings[mode]
- # Generate the mapping for the type
- if prec_mode.has_key('def')
- foreach _d : prec_mode['def']
- __cargs += ('-D' + _d)
- endforeach
- endif
- if prec_mode.has_key('undef')
- foreach _u : prec_mode['undef']
- __cargs += ('-U' + _u)
- endforeach
- endif
- # Now the rest, one run for each ext, to get the final symbols
- foreach ext, extdat : details['exts']
- extmap = ext_mappings[ext]
- if extmap.has_key('def')
- foreach _d : extmap['def']
- __cargs += ('-D' + _d)
- endforeach
- endif
- if extmap.has_key('undef')
- foreach _u : extmap['undef']
- __cargs += ('-U' + _u)
- endforeach
- endif
- # Construct the final paths
- src = join_paths(extdat['dir'], extdat['kernel'])
- if extdat.has_key('addl')
- __cargs += extdat['addl']
- endif
- sym_name = base.replace('?', mode) + ext
- message(sym_name)
- sym_underscored = f'@sym_name@_'
- __cargs += [
- f'-DASMNAME=@sym_name@',
- f'-DASMFNAME=@sym_underscored@',
- f'-DNAME=@sym_underscored@',
- f'-DCNAME=@sym_name@',
- f'-DCHAR_NAME="@sym_underscored@"',
- f'-DCHAR_CNAME="@sym_name@"',
- ]
- current_def = {
- 'c_args': __cargs,
- 'name': sym_name,
- 'src': src
- }
- message(__cargs)
- kernel_confs += current_def
- endforeach
- endforeach
- endforeach
-
- _kern_libs = []
- foreach conf: kernel_confs
- _kern_libs += static_library(
- conf['name'],
- conf['src'],
- include_directories: _inc,
- c_args: conf['c_args'],
- )
- endforeach
-
- _kern = static_library('_kern',
- link_whole: _kern_libs)
|