玉林社区   玉林社区买卖乐   编程新人如何快速上手 Taichi?
返回列表
查看: 190|回复: 0

编程新人如何快速上手 Taichi?

[复制链接]

8915

主题

9216

帖子

2万

积分

论坛元老

Rank: 8Rank: 8

积分
28518
发表于 2022-11-6 21:23:06 | 显示全部楼层 |阅读模式

马上注册玉林红豆网会员,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
[align=left][font=Tahoma, &quot][size=16px]介绍 Taichi Cookbook 中的 3 个实用小技巧:自动检查数组越界错误使用整数向量作为下标访问高维 field串行化顶层 for 循环技巧 1:自动检查数组越界错误底层编程语言(如 C++、CUDA)中数组访问越界是很常见的错误,发生这种情况的很多时候程序会默默继续执行,并在未来的某个时间给出错误的结果。(运气好的话)程序也有可能会抛出 segmentation fault。这样的错误很难调试。Taichi 提供了易用的调试模式,只需要在 ti.init 的时候指定 debug=True 就可以打开,并且会在运行时检查数组访问边界。import taichi as ti[/size][/font][/align]
[align=left][font=Tahoma, &quot][size=16px]ti.init(arch=ti.cpu, debug=True)[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]f = ti.field(dtype=ti.i32, shape=(32, 32))[/size][/font][/align]
[align=left][font=Tahoma, &quot][size=16px]@ti.kernel[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]def test() -> ti.i32:[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]    return f[0, 73][/size][/font][/align]
[align=left][font=Tahoma, &quot][size=16px]print(test())小结:必须开启 debug=True 才会进行数组范围检查支持的后端: ti.cpu 和 ti.cuda。(「我用别的后端怎么办?」切换成这两个后端之一调试,调试完了再切回去hhh)开启 debug=True 以后,因为数组范围检查等额外操作,程序性能会下降技巧 2:使用整数向量作为下标访问高维 field对于高维 field,有的时候用 val[i, j, k, l] 这样的形式访问太繁琐了,有没有更简单的形式呢?import taichi as ti[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]import matplotlib.pyplot as plt[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]import math[/size][/font][/align]
[align=left][font=Tahoma, &quot][size=16px]ti.init(arch=ti.cpu)[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]n = 512[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]img = ti.field(dtype=ti.i32, shape=(n, n))[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]img_magnified = ti.field(dtype=ti.i32, shape=(n, n))[/size][/font][/align]
[align=left][font=Tahoma, &quot][size=16px]@ti.kernel[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]def paint():[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]    for I in ti.grouped(img):[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]        f = (I / n) * math.pi * 10[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]        img[I] = ti.sin(f[0]) + ti.cos(f[1])[/size][/font][/align]

[align=left][font=Tahoma, &quot][size=16px]paint()[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]plt.imshow(img.to_numpy())[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]plt.show()[/size][/font][/align]
[align=left][font=Tahoma, &quot][size=16px]@ti.kernel[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]def magnify():[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]    for I in ti.grouped(img_magnified):[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]        img_magnified[I] = img[I // 2][/size][/font][/align]

[align=left][font=Tahoma, &quot][size=16px]    # 等效于[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]    # for i, j in img_magnified:[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]    #     img_magnified[i, j] = img[i // 2, j // 2][/size][/font][/align]
[align=left][font=Tahoma, &quot][size=16px]magnify()[/size][/font][/align]
[align=left][font=Tahoma, &quot][size=16px]plt.imshow(img_magnified.to_numpy())[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]plt.show()小结:for I in ti.grouped(img) 记得要使用 ti.grouped 才能将下标打包成一个 ti.Vector如果是浮点数向量,记得用 I.cast(ti.i32) 转化为整数,否则会出现 warning本技巧很大的用处在于「维度无关编程」,一套代码 2D、3D 都能跑技巧 3:串行化顶层 for 循环Taichi 顶层的 for 循环是默认自动并行的。但是很多时候程序需要串行,如何实现?import taichi as ti[/size][/font][/align]
[align=left][font=Tahoma, &quot][size=16px]ti.init(arch=ti.cpu)[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]n = 1024[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]val = ti.field(dtype=ti.i32, shape=n)[/size][/font][/align]
[align=left][font=Tahoma, &quot][size=16px]val.fill(1)[/size][/font][/align]
[align=left][font=Tahoma, &quot][size=16px]@ti.kernel[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]def prefix_sum():[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]    ti.loop_config(serialize=True)[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]    for i in range(1, n):[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]        val[i] += val[i - 1][/size][/font][/align]
[align=left][font=Tahoma, &quot][size=16px]prefix_sum()[/size][/font][/align][align=left][font=Tahoma, &quot][size=16px]print(val)小结:ti.loop_config(serialize=True) 会修饰紧接着的顶层 for 循环ti.loop_config 只对 顶层 的 range-for 循环有效。非顶层 for 循环默认就是串行的。想学习更多[url=http:///taichi-lang.cn/]taichi[/url]小技巧,希望对你学习 Taichi 带来帮助。taichi https://taichi-lang.cn/[/size][/font][/align]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

收藏:4 | 帖子:2万



侵权举报:本页面所涉内容均为用户发表并上传,岭南都会网仅提供存储服务,岭南都会网不承担相应的法律责任;如存在侵权问题,请权利人与岭南都会网联系删除!