Java教程

太极图形课笔记s1

本文主要是介绍太极图形课笔记s1,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

第一节

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

这篇关于太极图形课笔记s1的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!