# 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' : { 'dir': 'arm', 'kernel': 'rot.c', 'addl': [fma3_flag], 'exts': ['_k'], }, 'd' : { 'dir': 'arm', 'kernel': 'rot.c', 'addl': [fma3_flag], 'exts': ['_k'], }, 'q' : { 'dir': 'arm', 'kernel': 'zrot.c', 'exts': ['_k'], }, 'cs' : { 'dir': 'arm', 'kernel': 'zrot.c', 'exts': ['_k'], }, 'zd' : { 'dir': 'arm', 'kernel': 'zrot.c', 'exts': ['_k'], }, 'xq' : { 'dir': 'arm', 'kernel': 'zrot.c', 'exts': ['_k'], }, }, }, {'base': 'swap', 'modes': { 's' : { 'dir': 'arm', 'kernel': 'swap.c', 'exts': ['_k'], }, 'd' : { 'dir': 'arm', 'kernel': 'swap.c', 'exts': ['_k'], }, 'q' : { 'dir': 'x86_64', 'kernel': 'swap.S', 'exts': ['_k'], }, 'c' : { 'dir': 'arm', 'kernel': 'zswap.c', 'exts': ['_k'], }, 'z' : { 'dir': 'arm', 'kernel': 'zswap.c', 'exts': ['_k'], }, 'x' : { 'dir': 'arm', 'kernel': 'zswap.c', 'exts': ['_k'], }, }, }, {'base': 'scal', 'modes': { 's' : { 'dir': 'arm', 'kernel': 'scal.c', 'exts': ['_k'], }, 'd' : { 'dir': 'arm', 'kernel': 'scal.c', 'exts': ['_k'], }, 'q' : { 'dir': 'x86_64', 'kernel': 'scal.S', 'exts': ['_k'], }, 'c' : { 'dir': 'arm', 'kernel': 'zscal.c', 'exts': ['_k'], }, 'z' : { 'dir': 'arm', 'kernel': 'zscal.c', 'exts': ['_k'], }, 'x' : { 'dir': 'arm', 'kernel': 'zscal.c', 'exts': ['_k'], }, }, }, {'base': 'copy', 'modes': { 's' : { 'dir': 'arm', 'kernel': 'copy.c', 'exts': ['_k'], }, 'd' : { 'dir': 'arm', 'kernel': 'copy.c', 'exts': ['_k'], }, 'q' : { 'dir': 'arm', 'kernel': 'zcopy.c', 'exts': ['_k'], }, 'c' : { 'dir': 'arm', 'kernel': 'zcopy.c', 'exts': ['_k'], }, 'z' : { 'dir': 'arm', 'kernel': 'zcopy.c', 'exts': ['_k'], }, 'x' : { 'dir': 'arm', 'kernel': 'zcopy.c', 'exts': ['_k'], }, }, }, {'base': 'axpy', 'modes': { 's' : { 'dir': 'arm', 'kernel': 'axpy.c', 'exts': ['_k'], }, 'd' : { 'dir': 'arm', 'kernel': 'axpy.c', 'exts': ['_k'], }, 'q' : { 'dir': 'x86_64', 'kernel': 'axpy.S', 'exts': ['_k'], }, 'c' : { 'dir': 'arm', 'kernel': 'zaxpy.c', 'exts': ['_k'], }, 'z' : { 'dir': 'arm', 'kernel': 'zaxpy.c', 'exts': ['_k'], }, 'x' : { 'dir': 'arm', 'kernel': 'zaxpy.c', 'exts': ['_k'], }, }, }, {'base': 'dot', 'modes': { 's' : { 'dir': 'arm', 'kernel': 'dot.c', 'exts': ['_k'], }, 'd' : { 'dir': 'arm', 'kernel': 'dot.c', 'exts': ['_k'], }, 'q' : { 'dir': 'x86_64', 'kernel': 'dot.S', 'exts': ['_k'], }, 'c' : { 'dir': 'arm', 'kernel': 'zdot.c', 'exts': ['_k'], }, 'z' : { 'dir': 'arm', 'kernel': 'zdot.c', 'exts': ['_k'], }, 'x' : { 'dir': 'arm', 'kernel': 'zdot.c', 'exts': ['_k'], }, }, }, # xDOTU xDOTC xxDOT aren't present {'base': 'nrm2', 'modes': { 's' : { 'dir': 'arm', 'kernel': 'nrm2.c', 'exts': ['_k'], }, 'd' : { 'dir': 'arm', 'kernel': 'nrm2.c', 'exts': ['_k'], }, 'q' : { 'dir': 'arm', 'kernel': 'znrm2.c', 'exts': ['_k'], }, 'c' : { 'dir': 'arm', 'kernel': 'znrm2.c', 'exts': ['_k'], }, 'z' : { 'dir': 'arm', 'kernel': 'znrm2.c', 'exts': ['_k'], }, 'x' : { 'dir': 'arm', 'kernel': 'znrm2.c', 'exts': ['_k'], }, }, }, {'base': 'asum', 'modes': { 's' : { 'dir': 'arm', 'kernel': 'asum.c', 'exts': ['_k'], }, 'd' : { 'dir': 'arm', 'kernel': 'asum.c', 'exts': ['_k'], }, 'q' : { 'dir': 'arm', 'kernel': 'zasum.c', 'exts': ['_k'], }, 'c' : { 'dir': 'arm', 'kernel': 'zasum.c', 'exts': ['_k'], }, 'z' : { 'dir': 'arm', 'kernel': 'zasum.c', 'exts': ['_k'], }, 'x' : { 'dir': 'arm', 'kernel': 'zasum.c', 'exts': ['_k'], }, }, }, {'base': 'amax', 'modes': { 's' : { 'dir': 'arm', 'kernel': 'amax.c', 'exts': ['_k'], }, 'd' : { 'dir': 'arm', 'kernel': 'amax.c', 'exts': ['_k'], }, 'q' : { 'dir': 'arm', 'kernel': 'zamax.c', 'exts': ['_k'], }, 'c' : { 'dir': 'arm', 'kernel': 'zamax.c', 'exts': ['_k'], }, 'z' : { 'dir': 'arm', 'kernel': 'zamax.c', 'exts': ['_k'], }, 'x' : { 'dir': 'arm', 'kernel': 'zamax.c', 'exts': ['_k'], }, }, }, # # TODO: Handle the i*amax style # {'base': 'axpby', # 'modes': {'s': {'dir': 'arm', 'kernel': 'axpby.c', 'exts': ['_k']}, # 'd': {'dir': 'arm', 'kernel': 'axpby.c', 'exts': ['_k']}, # 'c': {'dir': 'arm', 'kernel': 'axpby.c', 'exts': ['_k']}, # 'z': {'dir': 'arm', 'kernel': 'axpby.c', 'exts': ['_k']}, # }, # }, # # 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] src = join_paths(details['dir'], details['kernel']) # 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 foreach ext : 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 message(mode + base + ext) sym_name = mode + base + ext 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)