From e91b0216cde6bd52f23dd97e3c484de7d9fd6333 Mon Sep 17 00:00:00 2001 From: Rohit Goswami Date: Sun, 17 Mar 2024 18:49:00 +0000 Subject: [PATCH] ENH: Add more L2 flags --- kernel/meson.build | 493 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 454 insertions(+), 39 deletions(-) diff --git a/kernel/meson.build b/kernel/meson.build index db441edf8..312a7cd1b 100644 --- a/kernel/meson.build +++ b/kernel/meson.build @@ -1,9 +1,5 @@ # Ordered As per https://netlib.org/blas/blasqr.pdf # NOTE: xROTG xROTMG xROTM have no kernels? -_kinds = [] -_rk = ['s', 'd'] -_ck = ['c', 'z'] -_std_dk = _rk + _ck # Standard precisions # TODO: Actually test and set this if true fma3_flag = '-mfma' @@ -11,264 +7,394 @@ 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 PRECsymbKERNEL from src and dir via files(dir + src) -# For the precs array, the following mapping is used for c_args: +# 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', - 'precs': { + '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', - 'precs': { + 'modes': { 's' : { 'dir': 'arm', 'kernel': 'swap.c', + 'exts': ['_k'], }, 'd' : { 'dir': 'arm', 'kernel': 'swap.c', + 'exts': ['_k'], }, 'q' : { 'dir': 'arm', 'kernel': 'zswap.c', + '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', - 'precs': { + 'modes': { 's' : { 'dir': 'arm', 'kernel': 'scal.c', + 'exts': ['_k'], }, 'd' : { 'dir': 'arm', 'kernel': 'scal.c', + 'exts': ['_k'], }, 'q' : { 'dir': 'arm', 'kernel': 'zscal.c', + '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', - 'precs': { + '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', - 'precs': { + 'modes': { 's' : { 'dir': 'arm', 'kernel': 'axpy.c', + 'exts': ['_k'], }, 'd' : { 'dir': 'arm', 'kernel': 'axpy.c', + 'exts': ['_k'], }, 'q' : { 'dir': 'arm', 'kernel': 'zaxpy.c', + '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', - 'precs': { + 'modes': { 's' : { 'dir': 'arm', 'kernel': 'dot.c', + 'exts': ['_k'], }, 'd' : { 'dir': 'arm', 'kernel': 'dot.c', + 'exts': ['_k'], }, 'q' : { 'dir': 'arm', 'kernel': 'zdot.c', + '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', - 'precs': { + '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', - 'precs': { + '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', - 'precs': { + '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'], + }, + }, + }, + # 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': 'zgemv_n.c', + 'exts': ['_n', '_t'], + }, + 'c' : { + 'dir': 'arm', + 'kernel': 'zgemv_n.c', + 'exts': ['_n', '_t', '_r', '_c', '_u', '_s', '_d'], + }, + 'z' : { + 'dir': 'arm', + 'kernel': 'zgemv_n.c', + 'exts': ['_n', '_t', '_r', '_c', '_u', '_s', '_d'], + }, + 'x' : { + 'dir': 'arm', + 'kernel': 'zgemv_n.c', + 'exts': ['_n', '_t', '_r', '_c', '_u', '_s', '_d'], + }, + }, + }, + {'base': 'gemm_beta', + 'modes': { + 's' : { + 'dir': 'generic', + 'kernel': 'gemm_beta.c', + 'exts': ['_n', '_t'], + }, + 'd' : { + 'dir': 'generic', + 'kernel': 'gemm_beta.c', + 'exts': ['_n', '_t'], + }, + 'q' : { + 'dir': 'generic', + 'kernel': 'zgemm_beta.c', + 'exts': ['_n', '_t'], + }, + 'c' : { + 'dir': 'generic', + 'kernel': 'zgemm_beta.c', + 'exts': ['_n', '_t', '_r', '_c', '_u', '_s', '_d'], + }, + 'z' : { + 'dir': 'generic', + 'kernel': 'zgemm_beta.c', + 'exts': ['_n', '_t', '_r', '_c', '_u', '_s', '_d'], + }, + 'x' : { + 'dir': 'generic', + 'kernel': 'zgemm_beta.c', + 'exts': ['_n', '_t', '_r', '_c', '_u', '_s', '_d'], }, }, }, @@ -276,52 +402,341 @@ base_kops = [ kernel_confs = [] -# For the precs array, the following mapping is used for c_args: +# For the modes array, the following mapping is used for c_args: # undef --> -Uwhatever # def --> -Dwhatever foreach _kop : base_kops - foreach pkey, pval : _kop['precs'] + foreach pkey, pval : _kop['modes'] + # TODO: This srcs should be in files() after this is ready + # dictionaries with files can't be printed with message kcfg = { - 'name': pkey + _kop['base'] + '_k', - # TODO: This should probably be in files() after this is ready - # dictionaries with files can't be printed with message 'src': pval['dir'] + '/' + pval['kernel'], } if pval.has_key('addl') kcfg += {'addl': pval['addl']} endif if 's' == pkey - kcfg += {'undef': ['COMPLEX', 'DOUBLE']} + foreach ext : pval['exts'] + kcfg += {'name': pkey + _kop['base'] + ext} + # Level 1 + if '_k' == ext + kcfg += { + 'undef': ['COMPLEX', 'DOUBLE'] + } + endif + # Level 2 + if '_n' == ext + kcfg += { + 'undef': ['DOUBLE', 'COMPLEX', 'TRANS'], + } + endif + if '_t' == ext + kcfg += { + 'undef': ['DOUBLE', 'COMPLEX'], + 'def': ['TRANS'] + } + endif + if '_U' == ext + kcfg += { + 'undef': ['DOUBLE', 'COMPLEX', 'LOWER'], + } + endif + if '_L' == ext + kcfg += { + 'undef': ['DOUBLE', 'COMPLEX'], + 'def': ['LOWER'] + } + endif + endforeach endif if 'd' == pkey - kcfg += { - 'undef': ['COMPLEX'], - 'def': ['DOUBLE'], - } + foreach ext : pval['exts'] + kcfg += {'name': pkey + _kop['base'] + ext} + # Level 1 + if '_k' == ext + kcfg += { + 'undef': ['COMPLEX'], + 'def': ['DOUBLE'], + } + endif + # Level 2 + if '_n' == ext + kcfg += { + 'undef': ['COMPLEX', 'TRANS'], + 'def': ['DOUBLE'] + } + endif + if '_t' == ext + kcfg += { + 'undef': ['COMPLEX'], + 'def': ['DOUBLE', 'TRANS'] + } + endif + if '_U' == ext + kcfg += { + 'undef': ['COMPLEX', 'LOWER'], + 'def': ['DOUBLE'] + } + endif + if '_L' == ext + kcfg += { + 'undef': ['COMPLEX'], + 'def': ['DOUBLE', 'LOWER'] + } + endif + endforeach endif if 'q' == pkey - kcfg += { - 'undef': ['COMPLEX'], - 'def': ['DXDOUBLE'], - } + foreach ext : pval['exts'] + kcfg += {'name': pkey + _kop['base'] + ext} + # Level 1 + if '_k' == ext + kcfg += { + 'undef': ['COMPLEX'], + 'def': ['XDOUBLE'], + } + endif + # Level 2 + if '_n' == ext + kcfg += { + 'undef': ['COMPLEX', 'TRANS'], + 'def': ['XDOUBLE'] + } + endif + if '_t' == ext + kcfg += { + 'undef': ['COMPLEX'], + 'def': ['XDOUBLE', 'TRANS'] + } + endif + if '_U' == ext + kcfg += { + 'undef': ['COMPLEX', 'LOWER'], + 'def': ['XDOUBLE'] + } + endif + if '_L' == ext + kcfg += { + 'undef': ['COMPLEX'], + 'def': ['XDOUBLE', 'LOWER'] + } + endif + endforeach endif # TODO: rot is nonstandard in this instance, taking cs zd xq # The others (scal, swap) take c z x, so we need to use in if 'c' in pkey - kcfg += { - 'undef': ['DOUBLE'], - 'def': ['COMPLEX'], - } + foreach ext : pval['exts'] + kcfg += {'name': pkey + _kop['base'] + ext} + # Level 1 + if '_k' == ext + kcfg += { + 'undef': ['DOUBLE'], + 'def': ['COMPLEX'], + } + endif + # Level 2 + if '_n' == ext + kcfg += { + 'undef': ['DOUBLE', 'TRANS', 'CONJ', 'XCONJ'], + 'def': ['COMPLEX'] + } + endif + if '_t' == ext + kcfg += { + 'undef': ['DOUBLE', 'CONJ', 'XCONJ'], + 'def': ['COMPLEX', 'TRANS'] + } + endif + if '_r' == ext + kcfg += { + 'undef': ['DOUBLE', 'TRANS', 'XCONJ'], + 'def': ['COMPLEX', 'CONJ'] + } + endif + if '_c' == ext + kcfg += { + 'undef': ['DOUBLE', 'XCONJ'], + 'def': ['COMPLEX', 'TRANS', 'CONJ'] + } + endif + if '_o' == ext + kcfg += { + 'undef': ['DOUBLE', 'TRANS', 'CONJ'], + 'def': ['COMPLEX', 'XCONJ'] + } + endif + if '_u' == ext + kcfg += { + 'undef': ['DOUBLE', 'CONJ'], + 'def': ['COMPLEX', 'TRANS', 'XCONJ'] + } + endif + if '_s' == ext + kcfg += { + 'undef': ['DOUBLE', 'TRANS'], + 'def': ['COMPLEX', 'CONJ', 'XCONJ'] + } + endif + if '_d' == ext + kcfg += { + 'undef': ['DOUBLE'], + 'def': ['COMPLEX', 'TRANS', 'CONJ', 'XCONJ'] + } + endif + if '_U' == ext + kcfg += { + 'undef': ['DOUBLE', 'LOWER'], + 'def': ['COMPLEX'] + } + endif + if '_L' == ext + kcfg += { + 'undef': ['DOUBLE'], + 'def': ['COMPLEX', 'LOWER'] + } + endif + endforeach endif if 'z' in pkey - kcfg += { - 'def': ['COMPLEX', 'DOUBLE'], - } + foreach ext : pval['exts'] + kcfg += {'name': pkey + _kop['base'] + ext} + # Level 1 + if '_k' == ext + kcfg += { + 'def': ['COMPLEX', 'DOUBLE'], + } + endif + # Level 2 + if '_n' == ext + kcfg += { + 'undef': ['CONJ', 'XCONJ', 'TRANS'], + 'def': ['COMPLEX', 'DOUBLE'], + } + endif + if '_t' == ext + kcfg += { + 'undef': ['CONJ', 'XCONJ'], + 'def': ['COMPLEX', 'DOUBLE', 'TRANS'] + } + endif + if '_r' == ext + kcfg += { + 'undef': ['TRANS', 'XCONJ'], + 'def': ['COMPLEX', 'DOUBLE', 'CONJ'] + } + endif + if '_c' == ext + kcfg += { + 'undef': ['XCONJ'], + 'def': ['COMPLEX', 'DOUBLE', 'TRANS', 'CONJ'] + } + endif + if '_o' == ext + kcfg += { + 'undef': ['CONJ', 'TRANS'], + 'def': ['COMPLEX', 'DOUBLE', 'XCONJ'] + } + endif + if '_u' == ext + kcfg += { + 'undef': ['CONJ'], + 'def': ['COMPLEX', 'DOUBLE', 'TRANS', 'XCONJ'] + } + endif + if '_s' == ext + kcfg += { + 'undef': ['TRANS'], + 'def': ['COMPLEX', 'DOUBLE', 'CONJ', 'XCONJ'] + } + endif + if '_d' == ext + kcfg += { + 'def': ['COMPLEX', 'DOUBLE', 'TRANS', 'CONJ', 'XCONJ'] + } + endif + if '_U' == ext + kcfg += { + 'undef': ['LOWER'], + 'def': ['COMPLEX', 'DOUBLE'] + } + endif + if '_L' == ext + kcfg += { + 'def': ['COMPLEX', 'DOUBLE', 'LOWER'] + } + endif + endforeach endif if 'x' in pkey - kcfg += { - 'def': ['COMPLEX', 'DXDOUBLE'], - } + foreach ext : pval['exts'] + kcfg += {'name': pkey + _kop['base'] + ext} + # Level 1 + if '_k' == ext + kcfg += { + 'def': ['COMPLEX', 'XDOUBLE'], + } + endif + # Level 2 + if '_n' == ext + kcfg += { + 'undef': ['XCONJ', 'CONJ', 'TRANS'], + 'def': ['XDOUBLE', 'COMPLEX'], + } + endif + if '_t' == ext + kcfg += { + 'undef': ['CONJ', 'XCONJ'], + 'def': ['XDOUBLE', 'COMPLEX', 'TRANS'] + } + endif + if '_r' == ext + kcfg += { + 'undef': ['TRANS', 'XCONJ'], + 'def': ['XDOUBLE', 'COMPLEX', 'CONJ'] + } + endif + if '_c' == ext + kcfg += { + 'undef': ['XCONJ'], + 'def': ['XDOUBLE', 'COMPLEX', 'TRANS', 'CONJ'] + } + endif + if '_o' == ext + kcfg += { + 'undef': ['TRANS', 'CONJ'], + 'def': ['XDOUBLE', 'COMPLEX', 'XCONJ'] + } + endif + if '_u' == ext + kcfg += { + 'undef': ['CONJ'], + 'def': ['XDOUBLE', 'COMPLEX', 'TRANS', 'XCONJ'] + } + endif + if '_s' == ext + kcfg += { + 'undef': ['TRANS'], + 'def': ['XDOUBLE', 'COMPLEX', 'CONJ', 'XCONJ'] + } + endif + if '_d' == ext + kcfg += { + 'def': ['XDOUBLE', 'COMPLEX', 'TRANS', 'CONJ', 'XCONJ'] + } + endif + if '_U' == ext + kcfg += { + 'undef': ['LOWER'], + 'def': ['COMPLEX', 'XDOUBLE'] + } + endif + if '_L' == ext + kcfg += { + 'def': ['COMPLEX', 'XDOUBLE', 'LOWER'] + } + endif + endforeach endif message(kcfg) endforeach