各位正在关注 Taichi 的小伙伴是否有这样的困惑,Taichi 很适合自己的项目但无从下手,阅读了许多文档却依旧找不到解法,停留在「想用但用不好」的状态?
为了帮助大家更好上手 Taichi,我们准备发起一个代码互助的活动,大家可以提交自己编写的 Taichi 代码,由 Taichi 开发者来帮忙分析解决代码中的问题。整个分析过程会整理成一次面向社区的直播,造福更多遇到类似问题的小伙伴。
活动目的
- 活动的目的是帮助大家减少编写代码的恐惧,同时通过借助社区的力量更快地提高成长。
代码征集时间
即日起至 6/29 下午 18:00
代码要求:
注:对于比较陌生领域的代码我们可能无法提供很好的建议。
参与方式
-
在本帖下方留言「代码互助」+代码的 GitHub 页面(需公开),我们会对提交上来的代码做初步评估,筛选出最符合公开解读的代码。
-
我们将通过论坛留言和私信被选中的代码作者进一步沟通
-
确认直播,并现场解读代码中可优化的部分, 解答大家的疑问
2 个赞
@jasvixban 你好 感谢你的投稿,以下是我们初步的一些意见:
- 多个没有数据依赖的kernel同时运行的问题
这个很遗憾不能实现,可能你得手动用一些 MPI 之类的工具去实现类似的功能
- 如何取出sparse list,拼接成dense list
这个操作由于是一个 runtime 的操作,所以基本上就是你所写的方法去 append
,目前没有更优化的方法
-
get_dense_kernel()
减少编译时间问题
注意到 get_dense_kernel()
是有两个 ti.template()
参数的,这会导致这个 kernel
会重复编译;所以一个方法是把 ti.template()
从参数中去掉。至于 dense_list
的长度不定问题,可能可以通过构建一个足够大的 dense_list
来解决,这样就用空间换取了时间。。
- Vec 条件指令加速
这个目前在 Taichi 中也还没有实现,未来可能会根据情况列入开发计划中;如果有强需求的话欢迎到 Taichi 的 repo 提交 feature request!
关于以上解答如果还有疑问欢迎继续讨论。
非常感谢!不过还有个小问题。第三点, 建议“把 ti.template()
从参数中去掉”,具体指啥?kernel参数必须得指定类型才行啊
抱歉说明有点简略了,原来的意思是直接把 get_dense_kernel()
的参数给去掉;具体来说,在这部分代码中,对于 get_dense_kernel()
来说 sparse_list
和 dense_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])