Highlights
New features
1. Dynamic indexing of matrices (experimental)
In previous versions of Taichi, a matrix can be accessed only with a *constant* index. As a result, you cannot perform operations such as clamp the minimum element in a vector to 0:
Python
ti.kernel
def clamp():
... assume we have a n-d vector A
min_index = 0
for i in range(n):
if A[i] < A[min_index]:
min_index = i
A[min_index] = 0
Of course, you may use the following workaround leveraging loop unrolling. It is, however, neither intuitive nor efficient:
Python
ti.kernel
def clamp():
... assume we have a n-d vector A
min_index = 0
for i in ti.static(range(n)):
if A[i] < A[min_index]:
min_index = i
for i in ti.static(range(n)):
if i == min_index:
A[i] = 0
With this new experimental feature of dynamic indexing of matrices, you can now run the former code snippet smoothly. The feature can be enabled by setting `ti.init(dynamic_index=True)`.
In v0.9.0, a new implicit FEM (Finite Element Method) example (https://github.com/taichi-dev/taichi/blob/master/python/taichi/examples/simulation/implicit_fem.py) is added, which also illustrates the benefit of having this feature. In this example, a huge (12 × 12) Hessian matrix is constructed for implicit time integration. Without dynamic indexing, the whole matrix construction loop needs to be unrolled, which takes 70 seconds to compile; with dynamic indexing, a traditional loop version can be applied, and the compilation time is shortened to 2.5 seconds.
2. Vulkan backend on macOS
Adds support for the `ti.vulkan` backend on macOS 10.15+ and now you can run GGUI on your macBook. Run the following GGUI examples to try for yourself.
Apache
prerequisites: taichi >= v0.9.0 and macOS >= 10.15
run GGUI examples
ti example fractal3d_ggui
ti example fem128_ggui
3. Compatibility with Google Colab
The system would crash if you run Taichi of an earlier version in the Google Colab notebook environment (see [235](https://github.com/taichi-dev/taichi/issues/235) for more information). In this release, we refactored our compiler implementation so that Taichi is compatible with Google Colab.
Feel free to run `!pip install taichi` to install Taichi and start your Colab journey with it.
Improvements
1. More stabilized, better-organized APIs
Ensuring the developers use the right set of APIs is critical to the long-term stability of Taichi's APIs. In this release, we started to reorganize its package structure and deprecate some obsolete or internal APIs. The following table lists some critical APIs that may concern you.
| **Category** | **Deprecated** **API** | **Replaced with** |
| --------------------- | -------------------------------- | ------------------------------------------ |
| **Builtin** | `max()` | `ti.max()` |
| **Builtin** | `min()` | `ti.min()` |
| **Atomic operation** | `obj.atomic_add()` | `ti.atomic_add()` |
| **Image-specific** | `ti.imread()` | `ti.tools.imread()` |
| **Image-specific** | `ti.imwrite()` | `ti.tools.imwrite()` |
| **Image-specific** | `ti.imshow()` | `ti.tools.imshow()` |
| **Profiler-specific** | `ti.print_profile_info()` | `ti.profiler.print_scoped_profiler_info()` |
| **Profiler-specific** | `ti.print_kernel_profile_info()` | `ti.profiler.print_kernel_profiler_info()` |
> For a representative list of APIs deprecated in this release, see [this Google doc](https://docs.google.com/spreadsheets/d/1FMECCsPMVDjzFN9p3Xy2e4CaA-ru9-lIHb1if-7zgLY/edit#gid=0).
2. Better error reporting
Lengthy traceback in an error report, for most of the time, can be distracting, making it hard to locate the code causing the error. In this release, we've removed the trivial traceback that does not concern developers in our error reporting to improve the debugging experience.
Taking the following code snippet as an example:
Python
import taichi as ti
ti.init()
ti.func
def bar(a):
a = a + 2j
ti.kernel
def foo():
bar(1)
foo()
Before v0.9.0, the error message looks like this:
Plain%20Text
[Taichi] Starting on arch=x64
Traceback (most recent call last):
File "error.py", line 13, in <module>
foo()
File "/path_to_taichi/lang/kernel_impl.py", line 709, in wrapped
return primal(*args, **kwargs)
File "/path_to_taichi/lang/kernel_impl.py", line 636, in __call__
key = self.ensure_compiled(*args)
File "/path_to_taichi/lang/kernel_impl.py", line 627, in ensure_compiled
self.materialize(key=key, args=args, arg_features=arg_features)
File "/path_to_taichi/lang/kernel_impl.py", line 493, in materialize
taichi_kernel = _ti_core.create_kernel(taichi_ast_generator,
File "/path_to_taichi/lang/kernel_impl.py", line 488, in taichi_ast_generator
compiled()
File "error.py", line 11, in foo
bar(1)
File "/path_to_taichi/lang/kernel_impl.py", line 76, in decorated
return fun.__call__(*args)
File "/path_to_taichi/lang/kernel_impl.py", line 156, in __call__
ret = self.compiled(*args)
File "error.py", line 7, in bar
a = a + 2j
File "/path_to_taichi/lang/common_ops.py", line 16, in __add__
return ti.add(self, other)
File "/path_to_taichi/lang/ops.py", line 78, in wrapped
return imp_foo(a, b)
File "/path_to_taichi/lang/ops.py", line 63, in imp_foo
return foo(x, y)
File "/path_to_taichi/lang/ops.py", line 427, in add
return _binary_operation(_ti_core.expr_add, _bt_ops_mod.add, a, b)
File "/path_to_taichi/lang/ops.py", line 173, in _binary_operation
a, b = wrap_if_not_expr(a), wrap_if_not_expr(b)
File "/path_to_taichi/lang/ops.py", line 36, in wrap_if_not_expr
return Expr(a) if not is_taichi_expr(a) else a
File "/path_to_taichi/lang/expr.py", line 33, in __init__
self.ptr = impl.make_constant_expr(arg).ptr
File "/path_to_taichi/lang/util.py", line 196, in wrapped
return func(*args, **kwargs)
File "/path_to_taichi/lang/impl.py", line 414, in make_constant_expr
raise ValueError(f'Invalid constant scalar expression: {type(val)}')
ValueError: Invalid constant scalar expression: <class 'complex'>
In v0.9.0, the error message looks like this:
Plain%20Text
Traceback (most recent call last):
File "/path_to_test/error.py", line 13, in <module>
foo()
File "/path_to_taichi/lang/kernel_impl.py", line 732, in wrapped
raise type(e)('\n' + str(e)) from None
taichi.lang.exception.TaichiTypeError:
On line 11 of file "/path_to_test/error.py", in foo:
bar(1)
^^^^^^
On line 7 of file "/path_to_test/error.py", in bar:
a = a + 2j
^^^^^^
Invalid constant scalar data type: <class 'complex'>
3. Revamped Taichi's documentation site
To improve the readability and user-friendliness of our documentation, we restructured [Taichi's documentation site](https://docs.taichi.graphics/) and incorporated [API reference](https://docs.taichi.graphics/api/) into it.
Join our discussions to build the next Taichi release for you!
We believe that our community plays a pivotal role in the development of the Taichi programming language. In that spirit, we encourage you to take an active part in our [GitHub Discussions](https://github.com/taichi-dev/taichi/discussions), propose potential changes, and contribute your ideas. Together, we improve the Taichi language release by release, for you and for every developer.
The following is a selected list of hot topics for you to start with:
- 4086
- 4183
Specifically, because beginners to Taichi sometimes get lost in different APIs such as `ti.Vector`, `ti.types.vector`, `ti.Vector.field`, we plan to make them clearer and would like to have your opinions on these proposed practices:
- Always keep type identifiers in lowercase.
- Always use `ti.types.vector` to define a vector *type*.
- After having type definitions like `my_vec2i = ti.types.vector(2, ti.i32)`, use `my_vec2i([5, 10])` for a vector *object*.
- For simplicity, we preserve `ti.vector([1, 2])` as a shortcut for `ti.types.vector()([1, 2])` , which automatically infers missing type information of the object.
- Use `ti.field(dtype=my_vec2i, shape=100)` for a field *object*.
API changes
See [this Google doc](https://docs.google.com/spreadsheets/d/1FMECCsPMVDjzFN9p3Xy2e4CaA-ru9-lIHb1if-7zgLY/edit#gid=0) for a representative list of APIs deprecated in this release.
Deprecation notice
Python 3.6 has reached EOL as of December 2021. The next major Taichi release (e.g. v1.0) will be the last official release for Python3.6 and we're actively working on adding support for Python3.10.
Full changelog:
- [test] Add a test for simple_derivative example (4323) (by **TinyBox**)
- [example] Add implicit fem example (4352) (by **bx2k**)
- [opengl] Use element shape as compile information for OpenGL backend (4284) (by **Haidong Lan**)
- [ci] Exit on error windows test script (4354) (by **Bo Qiao**)
- [bug] Update children_offsets & stride info to align as elem_stride (4345) (by **Ailing**)
- [gui] Update GGUI examples to use vulkan backend if available (4353) (by **Ailing**)
- [ci] Use conda python for m1 jobs (4351) (by **Ailing**)
- [lang] Add support for operators "is" and "is not" in static scope and deprecate them (4349) (by **Lin Jiang**)
- [ci] Increase ci test parallelism (4348) (by **Bo Qiao**)
- [opengl] Remove support for dynamic snode (by **Ailing Zhang**)
- [error] Let deprecation warnings display only once (4346) (by **Lin Jiang**)
- [ci] Fix generate_example_videos.py (4347) (by **Ailing**)
- [test] Add a test for autodiff/regression (4322) (by **TinyBox**)
- [ci] Install requirements and matplotlib for GPU tests (4336) (by **Bo Qiao**)
- [gui] [refactor] Avoid exposing different APIs with different GGUI_AVAILABLE values (4329) (by **Yi Xu**)
- [lang] Remove logical_and and logical_or from TaichiOperation (4326) (by **Lin Jiang**)
- [lang] Add deprecation warnings to atomic ops (4325) (by **Lin Jiang**)
- [refactor] Allow more build types from setup.py (4313) (by **Bo Qiao**)
- [refactor] make class Expr constructor explicit (4272) (by **Retrospection**)
- [doc] More revision on a new language (4321) (by **Ye Kuang**)
- [lang] Hide internal apis about Fields (4302) (by **Xiangyun Yang**)
- [Doc] Avoid log(0) problem in _funcs._randn() and update primitive_types.py (4317) (by **Zhao Liang**)
- [refactor] Remove Ndarray torch implementation and tests (4307) (by **Bo Qiao**)
- [Doc] Revise "Why a new programming language" (4306) (by **Ye Kuang**)
- [lang] Move sparse_matrix_builder from taichi.linalg to taichi.types (4301) (by **Ailing**)
- [lang] Make ti.cfg an alias of runtime cfg (4264) (by **Ailing**)
- [refactor] Refactor ForLoopDecoratorRecorder (4309) (by **PGZXB**)
- [lang] Hide dtype and needs_grad from SNode (4308) (by **Yi Xu**)
- [vulkan] Reduce runtime host overhead (4282) (by **Bob Cao**)
- [lang] Remove Matrix.value (4300) (by **Lin Jiang**)
- [lang] Hide internal APIs of FieldsBuilder (4305) (by **Yi Xu**)
- [lang] Hide pad_key and ndarray*_to_numpy in Ndarray (4298) (by **Bo Qiao**)
- [lang] Hide internal functions in SNode and _Root (4303) (by **Yi Xu**)
- [lang] Hide ndarray*_from_numpy (4297) (by **Bo Qiao**)
- [lang] Hide internal functions in Matrix and Struct (4295) (by **Lin Jiang**)
- [lang] Hide subscript in Matrix (4299) (by **Lin Jiang**)
- [lang] Hide initialize_host_accessor in Ndarray (4296) (by **Bo Qiao**)
- [lang] Hide internal functions in TaichiOperation (4288) (by **Lin Jiang**)
- [lang] Hide get_element_size and get_nelement in Ndarray (4294) (by **Bo Qiao**)
- [lang] Hide fill_by_kernel in Ndarray (4293) (by **Bo Qiao**)
- Hide data handle (4292) (by **Bo Qiao**)
- [lang] Remove CompoundType from taichi.types (4291) (by **Ailing**)
- [lang] Hide get_addr and type_assert in api docs (4290) (by **Ailing**)
- [lang] Only expose start_recording/stop_recording for now (4289) (by **Ailing**)
- [docs] Hide unnessary methods in annotation classes (4287) (by **Ailing**)
- [llvm] Use GEP for array access instead of ptrtoint/inttoptr (4276) (by **Yi Xu**)
- [lang] Fix bls_buffer allocation of x64 crashed in py3.10 (4275) (by **Chang Yu**)
- [misc] Code cleanup in benchmarks (4280) (by **rocket**)
- [doc] Improve operators page (4073) (by **Lin Jiang**)
- [spirv] Fix buffer info compare to fix external array bind point (4277) (by **Bob Cao**)
- [bug] Disallow function definition inside ti.func/kernel (4274) (by **Lin Jiang**)
- [refactor] Remove global instance of DecoratorRecorder (4254) (by **PGZXB**)
- [misc] Add stencil_2d to micro-benchmarks (4176) (by **rocket**)
- [refactor] Remove support for raise statement (4262) (by **Lin Jiang**)
- [refactor] Re-expose important implementation classes (4268) (by **Yi Xu**)
- [llvm] Add missing pre-processor macro in cpp-tests when LLVM is disabled (4269) (by **PGZXB**)
- Add more camera controls (4212) (by **Yu Zhang**)
- [vulkan] Test & build macOS 10.15 MoltenVK (4259) (by **Bob Cao**)
- [vulkan] Use TI_VISIBLE_DEVICE to select vulkan device (4255) (by **Bo Qiao**)
- [misc] Remove some unnecessary include lines (4265) (by **PGZXB**)
- [lang] Expose mesh_patch_idx at top level (4260) (by **Ailing**)
- [Bug] Only ban passing non contiguous torch tensors to taichi kernels. (4258) (by **Ailing**)
- [ci] Run on pull_request_target to access the secrets (4253) (by **Frost Ming**)
- [misc] Update master version to 0.9.0 (4248) (by **Ailing**)
- [misc] Use test_utils.approx directly (4252) (by **Ailing**)
- [ci] Move _testing.py into tests folder (4247) (by **Ailing**)
- [refactor] Remove get_current_program() and global variable current_program (4246) (by **PGZXB**)
- [Doc] Update sparse compuation doc (4060) (by **Peng Yu**)
- [Error] Raise an error when breaking the outermost loop (4235) (by **Lin Jiang**)
- [ci] Disable Vulkan backend for mac1015 release. (4245) (by **Ailing**)
- [Refactor] Move ti.quant & ti.type_factory under ti.types.quantized_types (4233) (by **Yi Xu**)
- [doc] Major revision to the field (advanced) document (4156) (by **Haidong Lan**)
- [vulkan] Disable buffer device address if int64 is not supported (4244) (by **Bob Cao**)
- [CUDA] Fix random generator routines for f32 and f64 to make sure the returned value is in [0, 1) (4243) (by **Zhao Liang**)
- [ci] Create PR card in projects automatically (4229) (by **Frost Ming**)
- [refactor] Remove dependency on get_current_program() in lang::BinaryOpExpression (4242) (by **PGZXB**)
- [Refactor] Add require_version configuration in ti.init() (4151) (by **ZHANG Zhi**)
- [ci] Disable Vulkan backend for mac1014 release. (4241) (by **Ailing**)
- [refactor] Remove global scope_stack and dependencies on it (4237) (by **PGZXB**)
- [refactor] Remove lang::current_ast_builder() and dependencies on it (4239) (by **PGZXB**)
- [vulkan] Add buffer device address (physical pointers) support & other improvements (4221) (by **Bob Cao**)
- [Refactor] Avoid exposing ti.tape (4234) (by **Bo Qiao**)
- [lang] Annotate constants with dtype without casting. (4224) (by **Ailing**)
- [refactor] Remove legacy ti.benchmark() and ti.benchmark_plot() (4222) (by **Xiangyun Yang**)
- [misc] Add memcpy to micro-benchmarks (4220) (by **Bo Qiao**)
- [Refactor] Merge ti.tools.image.imdisplay() into ti.tools.image.imshow() (4144) (by **Zhao Liang**)
- [Refactor] Rename and move memory profiler info under ti.profiler (4227) (by **Xiangyun Yang**)
- [Bug] Ban passing torch view tensors into taichi kernel (4225) (by **Ailing**)
- [refactor] Remove dependency on get_current_program() in lang::FrontendForStmt (4228) (by **PGZXB**)
- [metal] Give random seeds a unique value (4206) (by **Ye Kuang**)
- [autodiff] Refactor the IB identification and optimize the checker for global atomics and purely nested loops (4154) (by **Mingrui Zhang**)
- [doc] Add the step of setting "TI_WITH_VULKAN" for linux (4209) (by **Neko Null**)
- [doc] Add instruction to install clang-format-10 on M1 Mac (4219) (by **Lin Jiang**)
- [Refactor] Move public APIs of ti.tools outside top level (4218) (by **Yi Xu**)
- [Refactor] Move ti.parallel_sort under _kernels (4217) (by **Yi Xu**)
- [refactor] Remove top level __all__ (4214) (by **Yi Xu**)
- [vulkan] Support Vulkan 1.3 (4211) (by **Bob Cao**)
- [CI] Update release workflow (4215) (by **Jian Zeng**)
- [Refactor] Move ti.taichi_logo to examples (4216) (by **Yi Xu**)
- [vulkan] Fix MoltenVK support (4205) (by **Bob Cao**)
- [Refactor] Rename tools.util to tools.async_utils and hide functions inside (4201) (by **Yi Xu**)
- [spirv] SPIR-V / Vulkan NDArray (4202) (by **Bob Cao**)
- [misc] Export visibility of symbols required for Vulkan AOT execution (4203) (by **Gabriel H**)
- [misc] Test unified doc & api preview. (4186) (by **Ailing**)
- [refactor] Remove dependency on get_current_program() in exported functions of SNode (4192) (by **PGZXB**)
- [refactor] Export some functions which depend on current_ast_builder() as members of ASTBuilder (4131) (by **PGZXB**)
- [Refactor] Do not expose StructField and SourceBuilder to users (4200) (by **Yi Xu**)
- [Error] Add function name to traceback (4195) (by **Lin Jiang**)
- [Refactor] Remove redundant set_gdb_trigger (4198) (by **Yi Xu**)
- [javascript] Avoid using C++ inline asm when TI_EMSCRIPTENED (JS 6/n) (4109) (by **Dunfan Lu**)
- [javascript] Disable stack trace logging when TI_EMSCRIPTENED (JS 9/n) (4117) (by **Dunfan Lu**)
- [javascript] Support TI_EMSCRIPTENED option as an env var (JS 3/n) (4106) (by **Dunfan Lu**)
- [Refactor] Rename and move kernel profiler APIs (4194) (by **Yi Xu**)
- [doc] Update the doc for differentiable programming (4057) (by **Mingrui Zhang**)
- [misc] Add math operators to micro-benchmarks (4122) (by **rocket**)
- [misc] Add atomic operators to micro-benchmarks (4169) (by **rocket**)
- [dx11] Fix parse_reference_count signature (4189) (by **quadpixels**)
- [Doc] update demo code in readme doc (4193) (by **箱子**)
- [bug] [opengl] Process child nodes to compute alignment (4191) (by **Ailing**)
- [refactor] Remove dependency on current_ast_builder() in lang::For and cpp_tests (4185) (by **PGZXB**)
- [refactor] Add TI_DLL_EXPORT to control symbol visibility (4177) (by **Ye Kuang**)
- [refactor] Remove is_signed/is_integral from top level. (4182) (by **Ailing**)
- [refactor] Move version_check out of taichi.lang. (4178) (by **Ailing**)
- [refactor] Remove locale_encode from top level. (4179) (by **Ailing**)
- [refactor] Remove dependency on get_current_program() in lang::Ndarray (4162) (by **PGZXB**)
- [Refactor] Clean up helper functions in tools.util (4174) (by **Yi Xu**)
- [refactor] Remove bit_vectorize from top level. (4158) (by **Ailing**)
- [test] [example] Add a test for taichi_logo example (4170) (by **Isaac**)
- [Refactor] Remove inspect for modules in lang init (4173) (by **Bo Qiao**)
- remove KernelDefError KernelArgError InvalidOperationError (4166) (by **Lin Jiang**)
- [Refactor] Expose runtime/snode ops properly (4167) (by **Yi Xu**)
- [opengl] Use && instead of and in C++ code (4171) (by **Dunfan Lu**)
- [Refactor] Move core_vec(i) to gui and hide (4172) (by **Yi Xu**)
- [ci] Fix concurrent run issue (4168) (by **Frost Ming**)
- [Refactor] Rename and move scoped profiler info under ti.profiler (4165) (by **Yi Xu**)
- [spirv] Move external arrays into seperate buffers (4121) (by **Bob Cao**)
- [doc] Improve Fields documentation (4063) (by **rocket**)
- [refactor] Move functions in __init__ to misc (4150) (by **Xiangyun Yang**)
- [refactor] Remove dependency on get_current_program() and lang::current_ast_builder() in lang::Expr (4103) (by **PGZXB**)
- [refactor] Expose ti.abs and ti.pow (4157) (by **Lin Jiang**)
- [Doc] Update README.md (4139) (by **Ye Kuang**)
- [Refactor] Do not expose TapeImpl to users (4148) (by **Yi Xu**)
- [Refactor] Remove unnecessary exposure related to matrix and mesh (4152) (by **Lin Jiang**)
- [Refactor] Do not expose internal function in field, exception, expr, any_array , _ndrange, _ndarray (4137) (by **Xiangyun Yang**)
- [Refactor] Do not expose taichi.snode (4149) (by **Bo Qiao**)
- [refactor] [ir] Remove load_if_ptr and move pointer dereferencing to frontend-to-IR passes (4104) (by **daylily**)
- [Refactor] Do not expose internal function in ti.lang.impl (4134) (by **Xiangyun Yang**)
- [Refactor] Prevent modules in lang being wild imported and exposed (4140) (by **Bo Qiao**)
- Move __getattr__ back to __init__.py (4142) (by **Lin Jiang**)
- [Refactor] Avoid exposing real and integer types API (4129) (by **Bo Qiao**)
- [Refactor] Do not expose functions in taichi.lang.util to users (4128) (by **Yi Xu**)
- [Refactor] Do not expose main to users (4136) (by **Yi Xu**)
- [doc] Revise doc for GUI system. (4006) (by **Jiasheng Zhang**)
- [refactor] Remove critical/debug/error/trace/warn/info/is_logging_effective from top level (4133) (by **Ailing**)
- [Refactor] Remove supported_log_levels (4120) (by **Bo Qiao**)
- [ci] Fix approx in autodiff example test (4132) (by **Ailing**)
- [bug] Fix starred expression when the value is not a list (4130) (by **Lin Jiang**)
- Support compiling taichi in x86 (4107) (by **Dunfan Lu**)
- [javascript] Avoid all usages of glfw/vulkan/volk when TI_EMSCRIPTENED (JS 5/n) (4108) (by **Dunfan Lu**)
- [javascript] [misc] Remove redundant pybind include in Taichi Core Library (4110) (by **Dunfan Lu**)
- [test] Remove allclose at top level. (by **Ailing Zhang**)
- [test] Remove approx at top level. (by **Ailing Zhang**)
- [test] Remove get_rel_eps() at top level. (by **Ailing Zhang**)
- [test] Replace make_temp_file with tempfile (by **Ailing Zhang**)
- [Refactor] Remove exposure of internal functions in taichi.lang.ops (4101) (by **Lin Jiang**)
- [misc] Fix the changelog generator to only count current branch commits (4126) (by **Frost Ming**)
- [build] Handle empty TAICHI_EMBIND_SOURCE (4127) (by **Ailing**)
- [ci] Use GHA workflow to control the concurrency (4116) (by **Frost Ming**)
- [misc] Version bump: v0.8.11 -> v0.8.12 (4125) (by **Ailing**)
- [refactor] Remove dependency on lang::current_ast_builder() in lang::ConstantFold (4123) (by **PGZXB**)
- [doc] Add doc about difference between taichi and python programs (3996) (by **Lin Jiang**)
- [doc] Update docs about kernels and functions (4044) (by **Lin Jiang**)
- [misc] Add containers and end-to-end result to micro-benchmarks (4081) (by **rocket**)
- [opengl] Use element_size as alignment in root buffer. (4095) (by **Ailing**)
- [javascript] Add TI_EMSCRIPTENED to cmake options (JS 1/n) (4093) (by **Dunfan Lu**)
- [javascript] Add Javascript PR tag (JS 0/n) (4094) (by **Dunfan Lu**)
- [opt] Remove legacy vectorization pass (4096) (4099) (by **daylily**)
- [refactor] [ir] Refactor ExternalFuncCallExpression into a frontend statement (4098) (by **daylily**)
- [spirv] Add names to buffer struct types and pointers (4092) (by **Bob Cao**)
- [test] Add a test for the minimization example (4091) (by **Zydiii**)
- [refactor] Remove dependency on get_current_program() in ui/backends/vulkan (4076) (by **PGZXB**)
- [refactor] [ir] Use InternalFuncCall for retrieving thread index (4090) (by **daylily**)
- Add images to GL device API (4084) (by **Bob Cao**)
- [dx11] Add underlying DX11 device, memory allocation, and some tests (3971) (by **quadpixels**)
- [Bug] [lang] Ban redefinition of template and matrix arguments in Taichi kernel (4080) (by **Lin Jiang**)
- [bug] Fix warnings on external functions on windows (4079) (by **Lin Jiang**)
- [aot] [vulkan] Provide range_hint for range_for offloaded tasks in vulkan backend. (by **Ailing Zhang**)
- [refactor] Reuse SNode tree id (4056) (by **Lin Jiang**)
- [bug] Fix ndrange with star arguments (4077) (by **Lin Jiang**)
- [aot] [opengl] Provide range_hint for range_for offloaded tasks in (by **Ailing Zhang**)
- [misc] Add a minimal example for micro-benchmarks (4031) (by **rocket**)
- [doc] Refactor type system doc: primitive types (4055) (by **Yi Xu**)
- [misc] Migrate benchmarks to a new version (4059) (by **rocket**)
- [refactor] Re-export some functions called directly by ASTTransfomer.* as member of ASTBuilder (4034) (by **PGZXB**)
- [autodiff] Fix the local allocas defining in inner loop raising runtime error (4041) (by **Mingrui Zhang**)
- [opengl] Make sure ndarray arg bind indices are sorted. (4069) (by **Ailing**)
- [doc] Improve operator page (4067) (by **Bo Qiao**)
- [ir] [refactor] Make ReturnStmt support a vector of stmts (4028) (by **Xiangyun Yang**)
- [Lang] [bug] Stop misusing non-template argument types to determine template reinstantiation (4049) (by **Xiangyun Yang**)
- [misc] Version bump: v0.8.10 -> v0.8.11 (4053) (by **rocket**)