def _specialize_clusters(cls, clusters, **kwargs): options = kwargs['options'] platform = kwargs['platform'] sregistry = kwargs['sregistry'] # Optimize MultiSubDomains clusters = optimize_msds(clusters) # Toposort+Fusion (the former to expose more fusion opportunities) clusters = fuse(clusters, toposort=True, options=options) # Fission to increase parallelism clusters = fission(clusters) # Hoist and optimize Dimension-invariant sub-expressions clusters = cire(clusters, 'invariants', sregistry, options, platform) clusters = Lift().process(clusters) # Reduce flops clusters = extract_increments(clusters, sregistry) clusters = cire(clusters, 'sops', sregistry, options, platform) clusters = factorize(clusters) clusters = optimize_pows(clusters) # The previous passes may have created fusion opportunities clusters = fuse(clusters) # Reduce flops clusters = cse(clusters, sregistry) return clusters
def _specialize_clusters(cls, clusters, **kwargs): options = kwargs['options'] platform = kwargs['platform'] sregistry = kwargs['sregistry'] # Optimize MultiSubDomains clusters = optimize_msds(clusters) # Toposort+Fusion (the former to expose more fusion opportunities) clusters = fuse(clusters, toposort=True) # Hoist and optimize Dimension-invariant sub-expressions clusters = cire(clusters, 'invariants', sregistry, options, platform) clusters = Lift().process(clusters) # Reduce flops (potential arithmetic alterations) clusters = extract_increments(clusters, sregistry) clusters = cire(clusters, 'sops', sregistry, options, platform) clusters = factorize(clusters) clusters = optimize_pows(clusters) # The previous passes may have created fusion opportunities clusters = fuse(clusters) # Reduce flops (no arithmetic alterations) clusters = cse(clusters, sregistry) # Blocking to improve data locality clusters = blocking(clusters, options) return clusters