to_numpy()的使用

RT, 在使用GPU后端的时候,一个场A(50050050) 经过一些计算后,无法用to_numpy()转成ndarray,没有报错,就一直卡在A.to_numpy()这一步,请问这是为什么呢

这段代码是否是写在@ti.kernel或@ti.func外?
尝试一下小尺寸的看看行不行。

是写在 kernel 和func 之外,和尺寸没关系. 相同的尺寸,场A 经过小于1000的for循环计算,A.to_numpy()是没问题的,但是2000的for循环就不太行了,很奇怪,不知道为啥

能否提供一个最简复现代码?

请问你方便发一下邮箱,或者个人联系方式吗? 我发给你,多谢啦

最简单的复现代码 如下:

import taichi as ti

ti.init(arch=ti.gpu)

a = ti.field(dtype=ti.f32, shape=(502, 502, 51))

@ti.kernel
def test():

ti.loop_config(serialize=True)
for i in range(2000):
    for ix, iy, iz in ti.ndrange(502, 502, 51):
        a[ix, iy, iz] += ix + iy + iz + ti.random(float)

test()
print(‘1’)
a0 = a.to_numpy()
print(‘2’)

当for循环小于1000的时候,a0 = a.to_numpy()是没问题的;
当没有设置 ti.loop_config(serialize=True)的时候,for循环10000次,a0 = a.to_numpy()也是是没问题的;
但当设置了 ti.loop_config(serialize=True), for循环大于一定次数(比如2000)的时候 ,语句 a0 = a.to_numpy() 就一直卡着不动, 不知道为何。

python版本为3.10.12, taichi 为1.4.0, llvm为15.0.1

有大佬能帮忙看看解决一下吗? 多谢啦

我感觉你的代码在print(‘1’)时,其实test函数并没有运行完,所以你要求to_numpy的时候是在等待test运行完毕,所以并非是to_numpy卡住了,而是test本身还没执行完。如果你在test函数里加一句print某某的话,那么print 1也会等待到test运行完才会执行。

我觉得你在使用ti.loop_config(serialize=True)之后,里面的元素操作就不再是并行执行的,所以test函数变得特别 的慢,所以不如把外面的这个2000次循环拿到python scope里

import taichi as ti

ti.init(arch=ti.gpu)

a = ti.field(dtype=ti.f32, shape=(502, 502, 51))

@ti.kernel
def test():
    for ix, iy, iz in ti.ndrange(502, 502, 51):
        a[ix, iy, iz] += ix + iy + iz + ti.random(float)

for i in range(2000):
    test()
print('1')
a0 = a.to_numpy()
print('2')

这样就不需要串行执行了

谢谢,并行的话(ti.loop_config(serialize=False), 是没有任何问题的,但我现在要计算模拟的问题是需要串行的,所以这个 没办法更改,只是不知道为什么串行后,to_numpy()为什么会基本上用不了

把2000次for循环放在 python scope里就会非常非常慢,效果不佳。

关心的问题,解决了,虽然感觉不是很完美,还有优化空间。