第一节
hello world
1.引入太极库
import taichi as ti
ti.init(arch=gpu) #入口,支持cpu,gpu,cuda,opengl等
2.变量规则
- 有i32、i64、f32、f64等,默认32位
- 在taichi作用域中取第一次定义变量类型,如
#在taichi scope中
a=1
a=2.7
#a实际等于2
- ti.cast(a,ti.i32)转变变量类型
3.常用变量 - ti.Vector([1.0,2.0,3.0])
- ti.Matrix([1.6,1.4],[1.3,1.2])
- 使用[]寻址
- ti.field全局n维元素集合,标量访问需加[None]
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