Abies的笔记
机器人感知与运动控制(短)
实践课
Taichi简介
Taichi简介
注意
Generated by claude
结合Solar System.py用到的Taichi相关内容
这个代码是一个使用Taichi框架实现的N体引力系统模拟程序。让我详细讲解其中用到的Taichi知识点:
1. Taichi初始化
ti.init(ti.gpu) # ti.cpu / ti.gputi.init()用于初始化Taichi运行时环境- 参数可以选择
ti.gpu(GPU加速)或ti.cpu(CPU运行)
2. Taichi数据结构
Field(场)
mass = ti.field(ti.f32, N) # 标量场
pos = ti.Vector.field(2, ti.f32, N) # 2D向量场
vel = ti.Vector.field(2, ti.f32, N) # 2D向量场
force = ti.Vector.field(2, ti.f32, N) # 2D向量场
history = ti.Vector.field(2, ti.f32, shape=(N, MAX_HISTORY)) # 多维向量场- 标量场:
ti.field(数据类型, 形状)- 存储单个数值 - 向量场:
ti.Vector.field(维度, 数据类型, 形状)- 存储向量数据 - 数据类型:
ti.f32(32位浮点)、ti.i32(32位整数)等 - 形状参数:可以是单个数字或tuple,定义field的维度
数据传输
mass.from_numpy(mass_np) # 从numpy数组复制数据到Taichi field
pos.to_numpy() # 将Taichi field数据复制到numpy数组3. Taichi核函数(Kernel)
@ti.kernel装饰器
所有用@ti.kernel装饰的函数都会被编译成高性能的并行代码:
@ti.kernel
def clear_force():
for i in range(N):
force[i] = ti.Vector([0.0, 0.0])核函数特点
- 并行执行:for循环会自动并行化
- 类型注解:返回值需要类型注解,如
-> ti.f32 - 参数类型:外部数组需要用
ti.types.ndarray()注解
@ti.kernel
def copy_history_to_numpy(traj_np: ti.types.ndarray()):
# 处理外部numpy数组4. 并行计算模式
自动并行化
@ti.kernel
def compute_force():
for i in range(N): # 外层循环并行化
for j in range(i + 1, N): # 内层循环串行
# 计算引力...- 最外层的range循环会被自动并行化
- 嵌套循环保持串行,确保计算正确性
向量操作
dist = pos[i] - pos[j] # 向量减法
radius = dist.norm() # 向量模长
f = G * mass[i] * mass[j] / (radius ** 3) * dist # 向量标量运算Taichi内置了丰富的向量运算操作。
5. 内存访问模式
高效的内存访问
@ti.kernel
def update_semi_implicit_euler():
for i in range(N):
vel[i] += force[i] / mass[i] * dt # 直接访问field元素
pos[i] += vel[i] * dt- 直接通过索引访问field元素
- Taichi会优化内存访问模式
6. 数据类型系统
history_idx = ti.field(ti.i32, shape=N) # 32位整数
mass = ti.field(ti.f32, N) # 32位浮点常用数据类型:
ti.i32,ti.i64:整数类型ti.f32,ti.f64:浮点类型
7. 与外部库的集成
与GUI系统集成
gui = ti.GUI('N-body problem', (1024, 1024))
gui.circles(pos.to_numpy(), color=0xffffff, radius=planet_radius)Taichi提供了简单的GUI系统用于可视化。
8. 性能优化技巧
数值稳定性
radius = dist.norm() + 1e-6 # 避免除零错误循环展开和向量化
Taichi编译器会自动进行各种优化,包括循环展开、向量化等。
核心优势
- 简单易用:Python语法,但性能接近C++
- 自动并行:无需手动管理线程
- 跨平台:同样的代码可在CPU/GPU上运行
- 内存高效:优化的内存布局和访问模式
这个N体模拟展示了Taichi在科学计算中的强大能力,通过简洁的代码实现了高性能的物理模拟。