This section gives you some tips on the Taichi compiler development. Please make sure you have gone through developer installation.
Life of a Taichi kernel is a good place to get started, which explains the whole compilation process step by step.
Key folders: (the following chart can be generated by
tree . -L 2)
.├── benchmarks # Performance benchmarks├── docs # Documentation├── examples # Examples├── external # External libraries├── misc # Random yet useful files├── python # Python frontend implementation│ ├── core # Loading & interacting with Taichi core│ ├── lang # Python-embbed Taichi language & syntax (major)│ ├── snode # Structure nodes│ ├── tools # Handy end-user tools│ └── misc # Miscellaneous utilities├── taichi # The core compiler implementation: C++ source of libtaichi_core.so│ ├── analysis # Static analysis passes│ ├── backends # Device-dependent code generators/runtime environments│ ├── codegen # Code generation base classes│ ├── common # Common headers│ ├── gui # GUI system│ ├── inc # Small definition files to be included repeatedly│ ├── ir # Intermediate representation│ ├── jit # Just-In-Time compilation base classes│ ├── llvm # LLVM utilities│ ├── math # Math utilities│ ├── platform # Platform supports│ ├── program # Top-level constructs│ ├── python # C++/Python interfaces│ ├── runtime # LLVM runtime environments│ ├── struct # Struct compiler base classes│ ├── system # OS-related infrastructure│ ├── transforms # IR transform passes│ └── util # Miscellaneous utilities└── tests # Functional tests ├── cpp # Python tests (major) └── python # C++ tests
The C++ part of the Taichi compiler is written in C++17, and the Python part in 3.6+. You can assume that C++17 and Python 3.6 features are always available.
If you are working on the language frontend (Python/C++ interface), you may want to navigate across Python/C++ code. ffi-navigator allows you to jump from Python bindings to their definitions in C++. Please follow their README to set up your editor.
When creating a Taichi program using
ti.init(arch=desired_arch, **kwargs), pass in the following parameters
to make the Taichi compiler print out IRs in different stages:
print_ir=True: print the Taichi IR transformation process of kernel (excluding accessors) compilation.
print_accessor_ir=True: print the IR transformation process of data accessors, which are special and simple kernels. This is rarely used, unless you are debugging the compilation of data accessors.
print_struct_llvm_ir=True: save the emitted LLVM IR by Taichi struct compilers.
print_kernel_llvm_ir=True: save the emitted LLVM IR by Taichi kernel compilers.
print_kernel_llvm_ir_optimized=True: save the optimized LLVM IR of each kernel.
print_kernel_nvptx=True: save the emitted NVPTX of each kernel (CUDA only).
Data accessors in Python-scope are implemented as special Taichi
kernels. For example,
x[1, 2, 3] = 3 will call the writing accessor
print(y) will call the reading accessor kernel
See Benchmarking and regression tests if your work involves IR optimization.