1.引入太极库
import taichi as ti ti.init(arch=gpu) #入口,支持cpu,gpu,cuda,opengl等
2.变量规则
#在taichi scope中 a=1 a=2.7 #a实际等于2
heat_field = ti.field(dtype=ti.32, shape =(256,256)) #0维全局变量 a=ti.field(dtyoe=ti.f32,shape=()) a[None]=1.5
3.Kernels
在任何函数定义上方加@ti.kernel,表示下方的函数会以taichi高性能程序编译。
kernel只能在python scope(python域)中调用,即不能出现
@ti.kernel def foo(): print("foo") bar() @ti.kernel def bar(): print("bar")
这种情况
kernel比传统function快很多,主要原因是最外层for会被并行化,而最外层for内部的for是正常串行。
并行化for不能break!!!(可看作每次for单独执行互不影响)
使用+=或ti.atomic_add(total[None],x[i])会被原子锁保护,而拆开则不会被保护,可能出现for循环中两个分支同时写入的情况
N=10 x=ti.Vector.field(2,dtype=ti.i32,shape=(N,N))#field为N*N矩阵 @ti.kernel def foo(): for i,j in x: x[i,j]=ti.Vector([i,j]) foo() #for i,j遍历矩阵,但该方法只能在kernel最外层循环使用
kernel最多支持八个参数,且必须是type-hinted,只支持传标量参数,pass by value(传值,不改变外部变量)
@ti,kernel def my_kernel(x:ti.i32,y:ti.f32): print(x+y)
返回值必须是taichi类型
@ti.kernel def my_kernel()->ti.i32: return 233.666 #返回233
4.func
@ti.func
只能被ti.kernel调用
@ti.kernel def a(): b() @ti.func def b(): c()#func可嵌套调用,但不能递归,func会内联实现,仍是传值 @ti.func def c(): ...
func和kernel都是静态的
如果在python scope中定义a=32,在kernel或func中调用一次以后,再在python scope中修改,再使用kernel或func,里面的a仍是修改前的值,因为其不是全局变量,若想改变,请使用ti.field
5.其他
ti有很多计算函数(计算核17:13)
*乘法是逐位相乘,矩阵、向量乘法要用@
5.gui