def _specialize_clusters(cls, clusters, **kwargs): options = kwargs['options'] platform = kwargs['platform'] sregistry = kwargs['sregistry'] # 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, which in # turn may enable further optimizations clusters = fuse(clusters) clusters = eliminate_arrays(clusters) # Reduce flops (no arithmetic alterations) clusters = cse(clusters, sregistry) # Blocking to improve data locality clusters = Blocking(options).process(clusters) return clusters
def _specialize_clusters(cls, clusters, **kwargs): options = kwargs['options'] platform = kwargs['platform'] # To create temporaries counter = generator() template = lambda: "r%d" % counter() # Toposort+Fusion (the former to expose more fusion opportunities) clusters = fuse(clusters, toposort=True) # Hoist and optimize Dimension-invariant sub-expressions clusters = cire(clusters, template, 'invariants', options, platform) clusters = Lift().process(clusters) # Reduce flops (potential arithmetic alterations) clusters = extract_increments(clusters, template) clusters = cire(clusters, template, 'sops', options, platform) clusters = factorize(clusters) clusters = optimize_pows(clusters) # Reduce flops (no arithmetic alterations) clusters = cse(clusters, template) # Lifting may create fusion opportunities, which in turn may enable # further optimizations clusters = fuse(clusters) clusters = eliminate_arrays(clusters, template) return clusters
def _pipeline(self, clusters, *args): clusters = extract_time_invariants(clusters, *args) clusters = cire(clusters, *args) clusters = cse(clusters, *args) clusters = factorize(clusters) return clusters
def _specialize_clusters(cls, clusters, **kwargs): options = kwargs['options'] platform = kwargs['platform'] sregistry = kwargs['sregistry'] # 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 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): """ Optimize Clusters for better runtime performance. """ options = kwargs['options'] platform = kwargs['platform'] # To create temporaries counter = generator() template = lambda: "r%d" % counter() # Toposort+Fusion (the former to expose more fusion opportunities) clusters = Toposort().process(clusters) clusters = fuse(clusters) # Hoist and optimize Dimension-invariant sub-expressions clusters = cire(clusters, template, 'invariants', options, platform) clusters = Lift().process(clusters) # Blocking to improve data locality clusters = Blocking(options).process(clusters) # Reduce flops (potential arithmetic alterations) clusters = extract_increments(clusters, template) clusters = cire(clusters, template, 'sops', options, platform) clusters = factorize(clusters) clusters = optimize_pows(clusters) clusters = freeze(clusters) # Reduce flops (no arithmetic alterations) clusters = cse(clusters, template) # The previous passes may have created fusion opportunities, which in # turn may enable further optimizations clusters = fuse(clusters) clusters = eliminate_arrays(clusters, template) clusters = scalarize(clusters, template) 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, 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) # Blocking to define thread blocks if options['blockeager']: clusters = blocking(clusters, sregistry, options) # 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) # Blocking to define thread blocks if options['blocklazy']: clusters = blocking(clusters, sregistry, options) return clusters