ti.field 作为参数传入ti.kernel

我有一个使用了 ti.kernel 的函数,我想把 ti.field()/ti.Struct.field() 当作这个函数的参数,官方教程里推荐使用 ti.template()

之前一个帖子中 Tiantian Liu 中提到“但是这样的实现可维护性非常低,所以个人并不推荐采用这种实现方式”,所以我比较困惑于是否应该这样使用,我的应用场景中对算法速度要求比较高。

如果有人可以给出建议,非常感谢!

Hi yang-si-hang,
对于性能要求高的场景,使用ti.template()来避免内存拷贝是很正常的思路。

我个人感觉在遇到一个关于kernel参数的奇怪问题 - #6,来自 TiantianLiu 里Tiantian的意思应该不是说只要使用了ti.template()代码就不好维护,可以请 @TiantianLiu 老师介绍一下具体的semantics吗?

感谢解答 :handshake:

Tiantian 老师当时回答的语境应该是那位同学在 kernel 中访问了一些外部的变量,此时给 kernel 添加一个 ti.template() 参数改变了 kernel 在编译后的行为:

  1. 当 kernel 参数为空时,kernel 只会编译一次,因此在 kernel 编译后外部变量的变化不会被 kernel 感知到
  2. 当 kernel 有一个 ti.template() 参数时,kernel 会根据参数的变化而编译多个版本,此时 kernel 可能可以 somehow 感知到外部变量的变化,从而正好得出正确的答案

所以说问题不在于使用 ti.template 作为参数本身,而是说那个同学的 case 正好由此利用了 kernel 的编译特性,加一个参数和不加参数会导致完全不同的行为,这样的做法不是很好。也请 @jimyang 确认一下这边关于 kernel 编译的说法是否准确

2 个赞

嗯嗯,非常精确的解释,感谢!