def __call__(self, definition_ir) -> Dict[str, Dict[str, str]]: gtir = GtirPipeline(DefIRToGTIR.apply(definition_ir)).full() base_oir = gtir_to_oir.GTIRToOIR().visit(gtir) oir_pipeline = self.backend.builder.options.backend_opts.get( "oir_pipeline", DefaultPipeline(skip=[NoFieldAccessPruning])) oir = oir_pipeline.run(base_oir) cuir = oir_to_cuir.OIRToCUIR().visit(oir) cuir = kernel_fusion.FuseKernels().visit(cuir) cuir = extent_analysis.ComputeExtents().visit(cuir) cuir = extent_analysis.CacheExtents().visit(cuir) format_source = self.backend.builder.options.format_source implementation = cuir_codegen.CUIRCodegen.apply( cuir, format_source=format_source) bindings = GTCCudaBindingsCodegen.apply(cuir, module_name=self.module_name, backend=self.backend, format_source=format_source) return { "computation": { "computation.hpp": implementation }, "bindings": { "bindings.cu": bindings }, }
def __call__(self, definition_ir) -> Dict[str, Dict[str, str]]: gtir = DefIRToGTIR.apply(definition_ir) gtir_without_unused_params = prune_unused_parameters(gtir) dtype_deduced = resolve_dtype(gtir_without_unused_params) upcasted = upcast(dtype_deduced) oir = gtir_to_oir.GTIRToOIR().visit(upcasted) oir = self._optimize_oir(oir) cuir = oir_to_cuir.OIRToCUIR().visit(oir) cuir = kernel_fusion.FuseKernels().visit(cuir) cuir = extent_analysis.ComputeExtents().visit(cuir) cuir = extent_analysis.CacheExtents().visit(cuir) implementation = cuir_codegen.CUIRCodegen.apply(cuir) bindings = GTCCudaBindingsCodegen.apply(cuir, module_name=self.module_name) return { "computation": {"computation.hpp": implementation}, "bindings": {"bindings.cu": bindings}, }
def __call__(self, definition_ir) -> Dict[str, Dict[str, str]]: gtir = GtirPipeline(DefIRToGTIR.apply(definition_ir)).full() oir = OirPipeline(gtir_to_oir.GTIRToOIR().visit(gtir)).full( skip=[NoFieldAccessPruning]) cuir = oir_to_cuir.OIRToCUIR().visit(oir) cuir = kernel_fusion.FuseKernels().visit(cuir) cuir = extent_analysis.ComputeExtents().visit(cuir) cuir = extent_analysis.CacheExtents().visit(cuir) implementation = cuir_codegen.CUIRCodegen.apply(cuir) bindings = GTCCudaBindingsCodegen.apply(cuir, module_name=self.module_name, backend=self.backend) return { "computation": { "computation.hpp": implementation }, "bindings": { "bindings.cu": bindings }, }
def __call__(self, stencil_ir: gtir.Stencil) -> Dict[str, Dict[str, str]]: stencil_ir = GtirPipeline(stencil_ir).full() base_oir = GTIRToOIR().visit(stencil_ir) oir_pipeline = self.backend.builder.options.backend_opts.get( "oir_pipeline", DefaultPipeline(skip=[NoFieldAccessPruning]) ) oir_node = oir_pipeline.run(base_oir) oir_node = FillFlushToLocalKCaches().visit(oir_node) cuir_node = OIRToCUIR().visit(oir_node) cuir_node = kernel_fusion.FuseKernels().visit(cuir_node) cuir_node = extent_analysis.CacheExtents().visit(cuir_node) format_source = self.backend.builder.options.format_source implementation = cuir_codegen.CUIRCodegen.apply(cuir_node, format_source=format_source) bindings = CudaBindingsCodegen.apply( cuir_node, module_name=self.module_name, backend=self.backend, format_source=format_source, ) return { "computation": {"computation.hpp": implementation}, "bindings": {"bindings.cu": bindings}, }
def test_cache_extents(): testee = ProgramFactory( kernels__0__vertical_loops__0=VerticalLoopFactory( sections__0__horizontal_executions=[ HorizontalExecutionFactory( body=[AssignStmtFactory(left=IJCacheAccessFactory(name="tmp"))], extent=IJExtentFactory(i=(0, 1), j=(-3, 0)), ), HorizontalExecutionFactory( body=[ AssignStmtFactory( right=IJCacheAccessFactory(name="tmp", offset__i=1, offset__j=-3) ) ], extent=IJExtentFactory(i=(0, 0), j=(0, 0)), ), ], ij_caches=[IJCacheDeclFactory(name="tmp", extent=None)], ) ) transformed = extent_analysis.CacheExtents().visit(testee) cache = transformed.kernels[0].vertical_loops[0].ij_caches[0] assert cache.extent.i == (0, 1) assert cache.extent.j == (-3, 0)