编译时间12分钟,执行时间1.2s,如何减少编译时间?

写了个dense multiview stereo,编译时间12分钟,运行时间1.2秒 :joy:
有三个问题:

  1. 要减少python代码编译时间,编写代码有哪些注意事项?
  2. 有没有办法可以避免每次运行未做修改的python脚本都要重新编译?只能等待offline_cache
  3. 为什么运行时只利用了一个线程?

Hi,

12分钟确实是相当久的编译时间,楼主可以提供这段代码的链接吗?这样可以方便我们找到优化编译时间的地方。

@victoriacity
HI, 刚刚发现两个明显耗时的地方:

  1. ti.func传值。因此我尽可能只传scalar不传matrix和vector。但是返回值就没办法了,暂时传值。编译时间从12m减少到7.5m;
  2. 矩阵运算。

下面是其中一个函数和相应增加的编译时间

@ti.func
def compute_homography(id_camera_ref, id_camera_src, plane_hypothesis):
    # use notations as Eq. (18) in "Variational PatchMatch MultiView Reconstruction and Refinement"
    camera_ref = ti_cameras[id_camera_ref]
    camera_src = ti_cameras[id_camera_src]
	#以上增加一秒
    Ks = camera_ref.camera_matrix
    Rs = camera_ref.Rcw
    ts = camera_ref.tcw
    Kt = camera_src.camera_matrix
    Rt = camera_src.Rcw
    tt = camera_src.tcw
    #以上又增加0.7秒
    n = ti.Vector([plane_hypothesis.x, plane_hypothesis.y, plane_hypothesis.z], dt=ti.f32)
    d = plane_hypothesis.w
    H = Kt @ (Rt@Rs.transpose() - 1./d*(tt-Rt@Rs.transpose()@ts)@n.transpose() )  @ Ks.inverse()
    #以上又是6.9秒
    return H

发现编译时间和kernel数量也相关,尽管两个kernel内部调用了同一个func(仅参数不同),却耗费了两倍编译时间。 两个kernel简化为一个后,时间减半,从7.5分钟减少到4.5分钟。
这是否和inline有关呢?

Looking forward to the offline_cache in v0.9.2 :star_struck:

看上去 compute_homography 这个函数返回的是一个4×4矩阵,因为ti.Vectorti.Matrix的计算会被完全展开,这会导致编译时间变得更长。

ti.func 调用导致的编译时间变化的确和也和内联有关,如果你在一个很长的ti.static循环里调用了这个函数,比如

for i in ti.static(range(9)):
    compute_homography(...)

可以试试把ti.static去掉。由于ti.static的展开和函数内联,这相当于把这个函数的编译重复了9次。

1 个赞

@victoriacity 去掉所有循环的ti.static()之后,编译时间已经降低到达一分钟了 :+1: 猜测其他耗时大部分在访存上。

确实是,因为taichi的所有func都是强制inline的(没有不inline的办法),每个kernel调用的函数都会重新产生一份拷贝。所以taichi其实限制挺多的……在多年使用taichi感受到了这么多不便之处时,我决定:人生苦短,我用C++ :rofl:

2 个赞

这几天用taichi重写multiview stereo,感觉直接cuda更容易 :joy: Taichi全平台的理念很好,但是还有很长的路要走。