使用 Taichi 遇到问题无从下手?现在有一个让 Taichi 开发者帮你看代码的机会~

各位正在关注 Taichi 的小伙伴是否有这样的困惑,Taichi 很适合自己的项目但无从下手,阅读了许多文档却依旧找不到解法,停留在「想用但用不好」的状态?

为了帮助大家更好上手 Taichi,我们准备发起一个代码互助的活动,大家可以提交自己编写的 Taichi 代码,由 Taichi 开发者来帮忙分析解决代码中的问题。整个分析过程会整理成一次面向社区的直播,造福更多遇到类似问题的小伙伴。

活动目的

  • 活动的目的是帮助大家减少编写代码的恐惧,同时通过借助社区的力量更快地提高成长。

代码征集时间

即日起至 6/29 下午 18:00

代码要求:

  • 使用 Taichi 语言编写的代码

  • 代码长度尽量在 1000 行以内

  • 代码需要公开在 GitHub(涉:secret:内容请勿报名)

  • 需要对代码的逻辑有一个大致的描述,并且将自己的疑问事先整理好;最好可以更新在 GitHub Readme 中

注:对于比较陌生领域的代码我们可能无法提供很好的建议。

参与方式

  • 在本帖下方留言「代码互助」+代码的 GitHub 页面(需公开),我们会对提交上来的代码做初步评估,筛选出最符合公开解读的代码。

  • 我们将通过论坛留言和私信被选中的代码作者进一步沟通

  • 确认直播,并现场解读代码中可优化的部分, 解答大家的疑问

2 个赞

代码收到啦~~

@jasvixban 你好:wave: 感谢你的投稿,以下是我们初步的一些意见:

  1. 多个没有数据依赖的kernel同时运行的问题
    这个很遗憾不能实现,可能你得手动用一些 MPI 之类的工具去实现类似的功能
  2. 如何取出sparse list,拼接成dense list
    这个操作由于是一个 runtime 的操作,所以基本上就是你所写的方法去 append ,目前没有更优化的方法
  3. get_dense_kernel() 减少编译时间问题
    注意到 get_dense_kernel() 是有两个 ti.template() 参数的,这会导致这个 kernel 会重复编译;所以一个方法是把 ti.template() 从参数中去掉。至于 dense_list 的长度不定问题,可能可以通过构建一个足够大的 dense_list 来解决,这样就用空间换取了时间。。
  4. Vec 条件指令加速
    这个目前在 Taichi 中也还没有实现,未来可能会根据情况列入开发计划中;如果有强需求的话欢迎到 Taichi 的 repo 提交 feature request!

关于以上解答如果还有疑问欢迎继续讨论。

非常感谢!不过还有个小问题。第三点, 建议“把 ti.template() 从参数中去掉”,具体指啥?kernel参数必须得指定类型才行啊

抱歉说明有点简略了,原来的意思是直接把 get_dense_kernel() 的参数给去掉;具体来说,在这部分代码中,对于 get_dense_kernel() 来说 sparse_listdense_list 都是可见的

def run_kernel(sparse_list, length):
    start_time = time.time()
    sparse_kernel(sparse_list, length)
    print(f"[Taichi] time for sparse: {(time.time() - start_time): 0.4f} sec")

    start_time = time.time()
    num_items = length.to_numpy().sum()
    dense_list = ti.field(ti.i32)
    block = ti.root.dense(ti.i, 1)
    values = block.dynamic(ti.j, num_items, chunk_size=4)
    values.place(dense_list)
    get_dense_kernel()  # 直接去访问 sparse_list, dense_list

所以 get_dense_kernel() 可以这样定义:


@ti.kernel
def get_dense_kernel():  # 无参数
    for i in range(sparse_list.shape[0]):
        for j in range(sparse_list[i].length()):
            dense_list[0].append(sparse_list[i, j])