其他分享
首页 > 其他分享> > 太极图形课笔记s1

太极图形课笔记s1

作者:互联网

第一节

hello world

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

标签:kernel,taichi,s1,笔记,field,func,ti,太极,def
来源: https://www.cnblogs.com/Los1r/p/15360924.html