在动画电影里面一般都会有连续介质,比如雪的模拟。这里有仅需要99行代码就可以写一个简单的连续介质模拟器。我通过一个很基础的分形例子来介绍下Taichi编程语言。
![物理模拟引擎 Taichi编程语言](http://p2.ttnews.xyz/loading.gif)
首先根据你自己的硬件及OS来安装Taichi,用pip命令。
可以使用如下命令:
# Python 3.6+ needed
# CPU only. No GPU/CUDA needed. (Linux, OS X and Windows)
python3 -m pip install taichi-nightly
# With GPU (CUDA 10.0) support (Linux only)
python3 -m pip install taichi-nightly-cuda-10-0
# With GPU (CUDA 10.1) support (Linux only)
python3 -m pip install taichi-nightly-cuda-10-1
现在可准备运行如下的Taichi的代码了,为了计算Julia set。
python3 fractal.py
fractal.py的代码如下;
import taichi as ti
ti.cfg.arch = ti.cuda # Run on GPU by default
n = 320
pixels = ti.var(dt=ti.f32, shape=(n * 2, n))
@ti.func
def complex_sqr(z):
return ti.Vector([z[0] * z[0] - z[1] * z[1], z[1] * z[0] * 2])
@ti.kernel
def paint(t: ti.f32):
for i, j in pixels: # Parallized over all pixels
c = ti.Vector([-0.8, ti.sin(t) * 0.2])
z = ti.Vector([float(i) / n - 1, float(j) / n - 0.5]) * 2
iterations = 0
while z.norm() < 20 and iterations < 50:
z = complex_sqr(z) + c
iterations += 1
pixels[i, j] = 1 - iterations * 0.02
gui = ti.GUI("Fractal", (n * 2, n))
for i in range(1000000):
paint(i * 0.03)
gui.set_image(pixels)
gui.show()
接下来解释下代码。
1、导入taichi包
import taichi as ti
taichi是python中的一个嵌入式DSL,它提供了一个解释性的python包。
这意味着为python程序员提供了编写taichi语言的可能性,仅花费很少的学习代价。
2、可移植性
taichi既支持cpu又支持NVIDIA GPU。如果机器没有CUDA的支持,taichi将退回到cpu支持。
# Run on GPU
ti.cfg.arch = ti.cuda
# Run on CPU
ti.cfg.arch = ti.x86_64
3、张量
taichi是面向数据的编程语言。
pixels = ti.var(dt=ti.f32, shape=(n * 2, n))
表示分配了2D张量,命名为pixels ,类型是ti.f32,size是(n * 2, n),如(640, 320)。
4、函数(Functions)及核心(kernels)
实际的计算主要在taichi的kernels中进行。Kernel参数是hinted类型,编写的函数看起来类似
python。
你也可以用ti.func定义taichi函数,能被kernels调用。
5、并行for-loops
在taichi kernel的for-loop,是自动并行处理的。如下形式。
@ti.kernel
def fill():
for i in range(10): # parallelized
x[i] += i
s = 0
for j in range(5): # serialized in each parallel thread
s += j
y[i] = s
6、与python的集成
在python范围内,可以用简单标引语法来访问Taichi张量。形式如下。
image[42, 11] = 0.7
print(image[1, 63])
import numpy as np
pixels.from_numpy(np.random.rand(n * 2, n))
import matplotlib.pyplot as plt
plt.imshow(pixels.to_numpy())
plt.show()
![物理模拟引擎 Taichi编程语言](http://p2.ttnews.xyz/loading.gif)
閱讀更多 AI踐行者 的文章