Taichi_01_First_Taichi_Program
First Taichi Program
Taichi - “Hello world”
-
Data
-
Computation
-
Visualization
Init
import taichi as ti |
得到结果:
> python -u "d:\K1ose\code\Taichi\sample.py" |
应为我是核显,没有gpu,所以回滚到了cpu进行运行;
Data Type
Primitive types
-
signed integers: ti.i8, ti.i16, ti,i32, ti.i64
-
unsigned integers: ti.u8, ti.u16, ti,u32, ti.u64
-
floating points: ti.f32, ti.f64
Default types
-
using int or float for default types
-
can be changed via ti.init
ti.init(default_fp=ti.f32) # float = ti.f32
ti.init(default_fp=ti.f64) # float = ti.f64
ti.init(default_fp=ti.i32) # int = ti.i32
ti.init(default_fp=ti.i64) # int = ti.i64
Type promotions
-
pick more precious type
i32 + f32 = f32
i32 + i64 = i64
Type cast
def foo3(): |
得到的结果为:
> python -u "d:\K1ose\code\Taichi\sample.py" |
存在隐式转换;
可以使用ti.cast()
对不同类型的数据进行类型转换;
# 修饰函数,在taichi作用域中 |
Vector & matrix & struct
向量、矩阵和结构
# 向量和矩阵来构建结构 |
得到的结果为:
> python -u "d:\K1ose\code\Taichi\sample.py" |
Field
# ti.field |
ti.kernel & ti.func
ti.kernel
在ti.kernel修饰后,就被识别编译成taichi作用域中的程序;
# about ti.kernel |
在执行上面代码的时候会报错;
Kernels cannot call other kernels. I.e., nested kernels are not allowed. Please check if you have direct/indirect invocation of kernels within kernels. Note that some methods provided by the Taichi standard library may invoke kernels, and please move their invocations to Python-scope. |
但是执行python_func()可运行;
Parallelize
在ti.kernel修饰后,当检测到程序是在并行环境中运行时,最外层的域(循环或是条件)会自动并行;
|
因此如果要最大化优化,需要考虑如何处理循环和条件的并行串行关系,可以把多层循环拆分,用ti.kernel去修饰可以并行的循环或条件
Race condition
有两种用法可以避免data race的情况:
- 操作符连用,例如
total+=x[i]
- atomic函数,例如
ti.atomic_add(total,x[i])
如果使用total = total + x[i],则可能因为并行而发生data race
pass argument
def argument(a: ti.f32, b: ti.f64) |
return value
def returnVal() -> ti.i32 # to return int32 value |
ti.func
与ti.kernel不同的是,只能从ti.kernel中被调用,必须处在ti.kernel作用域中
帮助重复使用某个函数,强制内联而不支持递归
visualize
GUI
gui = ti.GUI("sample", (512, 512)) |
Sample
init - data - computaiton - visualizaiton
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 K1ose's Space!