写了个dense multiview stereo,编译时间12分钟,运行时间1.2秒
有三个问题:
- 要减少python代码编译时间,编写代码有哪些注意事项?
- 有没有办法可以避免每次运行未做修改的python脚本都要重新编译?只能等待offline_cache?
- 为什么运行时只利用了一个线程?
写了个dense multiview stereo,编译时间12分钟,运行时间1.2秒
有三个问题:
Hi,
12分钟确实是相当久的编译时间,楼主可以提供这段代码的链接吗?这样可以方便我们找到优化编译时间的地方。
@victoriacity
HI, 刚刚发现两个明显耗时的地方:
ti.func
传值。因此我尽可能只传scalar不传matrix和vector。但是返回值就没办法了,暂时传值。编译时间从12m减少到7.5m;下面是其中一个函数和相应增加的编译时间
@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
看上去 compute_homography
这个函数返回的是一个4×4矩阵,因为ti.Vector
和ti.Matrix
的计算会被完全展开,这会导致编译时间变得更长。
ti.func
调用导致的编译时间变化的确和也和内联有关,如果你在一个很长的ti.static
循环里调用了这个函数,比如
for i in ti.static(range(9)):
compute_homography(...)
可以试试把ti.static
去掉。由于ti.static
的展开和函数内联,这相当于把这个函数的编译重复了9次。
确实是,因为taichi的所有func都是强制inline的(没有不inline的办法),每个kernel调用的函数都会重新产生一份拷贝。所以taichi其实限制挺多的……在多年使用taichi感受到了这么多不便之处时,我决定:人生苦短,我用C++
这几天用taichi重写multiview stereo,感觉直接cuda更容易 Taichi全平台的理念很好,但是还有很长的路要走。