ENH: Add more L2 flags

This commit is contained in:
Rohit Goswami 2024-03-17 18:49:00 +00:00 committed by Mateusz Sokół
parent 75ea24cdea
commit e91b0216cd
1 changed files with 454 additions and 39 deletions

View File

@ -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,53 +402,342 @@ 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']
kcfg = {
'name': pkey + _kop['base'] + '_k',
# TODO: This should probably be in files() after this is ready
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 = {
'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
foreach ext : pval['exts']
kcfg += {'name': pkey + _kop['base'] + ext}
# Level 1
if '_k' == ext
kcfg += {
'undef': ['COMPLEX'],
'def': ['DOUBLE'],
}
endif
if 'q' == pkey
# Level 2
if '_n' == ext
kcfg += {
'undef': ['COMPLEX', 'TRANS'],
'def': ['DOUBLE']
}
endif
if '_t' == ext
kcfg += {
'undef': ['COMPLEX'],
'def': ['DXDOUBLE'],
'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
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
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
foreach ext : pval['exts']
kcfg += {'name': pkey + _kop['base'] + ext}
# Level 1
if '_k' == ext
kcfg += {
'def': ['COMPLEX', 'DOUBLE'],
}
endif
if 'x' in pkey
# Level 2
if '_n' == ext
kcfg += {
'def': ['COMPLEX', 'DXDOUBLE'],
'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
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
endforeach