#include "taichi/ir/ir_builder.h" #include "taichi/ir/statements.h" #include "taichi/program/program.h" using namespace taichi; using namespace lang; void run_aot(taichi::Arch arch) { default_compile_config.advanced_optimization = false; auto program = Program(arch); int n = 10; // program.materialize_runtime(); auto *root = new SNode(0, SNodeType::root); auto *pointer = &root->dense(Axis(0), n); auto *place = &pointer->insert_children(SNodeType::place); place->dt = PrimitiveType::i32; program.add_snode_tree(std::unique_ptr(root), /*compile_only=*/true); auto aot_builder = program.make_aot_module_builder(arch, {}); std::unique_ptr kernel_init, kernel_ret; { /* @ti.kernel def init(): for index in range(n): place[index] = index */ IRBuilder builder; auto *zero = builder.get_int32(0); auto *n_stmt = builder.get_int32(n); auto *loop = builder.create_range_for(zero, n_stmt, 0, 4); { auto _ = builder.get_loop_guard(loop); auto *index = builder.get_loop_index(loop); auto *ptr = builder.create_global_ptr(place, {index}); builder.create_global_store(ptr, index); } kernel_init = std::make_unique(program, builder.extract_ir(), "init"); } { /* @ti.kernel def ret(): sum = 0 for index in place: sum = sum + place[index]; return sum */ IRBuilder builder; auto *sum = builder.create_local_var(PrimitiveType::i32); auto *loop = builder.create_struct_for(pointer, 0, 4); { auto _ = builder.get_loop_guard(loop); auto *index = builder.get_loop_index(loop); auto *sum_old = builder.create_local_load(sum); auto *place_index = builder.create_global_load(builder.create_global_ptr(place, {index})); builder.create_local_store(sum, builder.create_add(sum_old, place_index)); } builder.create_return(builder.create_local_load(sum)); kernel_ret = std::make_unique(program, builder.extract_ir(), "ret"); kernel_ret->insert_ret(PrimitiveType::i32); kernel_ret->finalize_rets(); } aot_builder->add_field("place", place, true, place->dt, {n}, 1, 1); aot_builder->add("init", kernel_init.get()); aot_builder->add("ret", kernel_ret.get()); aot_builder->dump(".", taichi::arch_name(arch) + "_aot.tcb"); std::cout << "done" << std::endl; } int main() { run_aot(host_arch()); #ifdef TI_WITH_VULKAN run_aot(taichi::Arch::vulkan); #endif #ifdef TI_WITH_DX12 run_aot(Arch::dx12); #endif }