物理模拟引擎 Taichi编程语言

在动画电影里面一般都会有连续介质,比如雪的模拟。这里有仅需要99行代码就可以写一个简单的连续介质模拟器。我通过一个很基础的分形例子来介绍下Taichi编程语言。


物理模拟引擎 Taichi编程语言


首先根据你自己的硬件及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编程语言


分享到:


相關文章: