可微编程与ti.svd()

在可微编程中,ti.kernel 中无法使用 ti.svd() 操作. 例如如下代码片段

import taichi as ti
import numpy as np
ti.init(arch=ti.cuda, debug=True)

loss = ti.field(shape=(), dtype=ti.f32, needs_grad=True)

@ti.kernel
def func():
    for i in range(1):
        A = ti.Matrix([[1., 1., 1.], [0., 1., 1.], [0., 0., 1.]], dt=ti.f32)
        U, S, V = ti.svd(A)


with ti.ad.Tape(loss, validation=True):
    func()

print('END')

forward过程执行完之后显示报错

[I 09/08/24 19:42:12.757 26704] [auto_diff.cpp:taichi::lang::MakeAdjoint::visit@1334] 
"unary_op_type_name(stmt->op_type)": "cast_bits"
[E 09/08/24 19:42:12.757 26704] [auto_diff.cpp:taichi::lang::MakeAdjoint::visit@1335] Not supported.

这个问题可以解决吗?

在论文difftaichi中提到了对于complex kernels,需要手写backward.并且以3*3矩阵的SVD分解为例,但很可惜没有给出代码,只给了伪代码: