def choose_params(params: Parameters) -> BlockedParameters: print("dxsp_blocked.choose_params") pattern = Matrix.load_pattern(params.mtx_filename) #TODO: Choose bk,bn better bm = 8 if params.bm is None else params.bm bn = 8 if params.bn is None else params.bn bk = 8 if params.bk is None else params.bk params.bm = bm params.bn = bn params.bk = bk # TODO: Currently does not support fringe Bk, Bn = params.k // bk, params.n // bn patterns = [] blocks = Matrix.full(Bk, Bn, -1) x = 0 for Bni in range(Bn): for Bki in range(Bk): block = pattern[(Bki * bk):((Bki + 1) * bk), (Bni * bn):((Bni + 1) * bn)] found = False for pi in range(len(patterns)): if patterns[pi] == block: blocks[Bki, Bni] = pi found = True if not found: blocks[Bki, Bni] = x x += 1 patterns.append(block) return BlockedParameters(params, blocks, patterns)
def choose_params(params: Parameters) -> TiledParameters: """ Augment the generic user-supplied parameters with optimal tiled-specific ones""" print("dxsp_tiled.choose_params") full_mtx = Matrix.load_pattern(params.mtx_filename) #TODO: Choose optimal bm,bn,bk given m,n,k,full_mtx bm = 8 if params.bm is None else params.bm bn = 8 if params.bn is None else params.bn bk = 8 if params.bk is None else params.bk params.bm = bm params.bn = bn params.bk = bk #TODO: Generate better funcname params.output_funcname = f"gemm_tiled_{params.m}x{params.n}x{params.k}" # Take tile pattern to be upper left-hand corner # TODO: Take logical union of all tiles pattern_mtx = full_mtx[:bk,:bn] return TiledParameters(params, pattern_mtx)