Ti.func函数内声明数组

我知道可以用field声明一个全局变量作为缓存,然后传入到ti.func函数中,但是直接在func函数中声明数组作为缓存也许是更好的解决方案。

有没有办法声明一个栈上的临时数组?

用例代码CUDA版本:

__device__
void foo(......) {
    AABB nodes[40];
    ......
}

我试过Vector,但是Vector是并行展开的,其index是静态编译好的
我也试过python的数组 [],这个没有办法用动态的数字下标访问,只能用静态的数字访问。

你是想要类似C++中的Vector么?

Taichi 提供 ti.dynamic 结点,可以满足你的要求?

可以参考:


感谢您的回答!我查了下dynamic这个feature好像文档提到的不多,我没法了解它的内部运作机制(内存如何动态管理的)。另外我前面提的问题并不是想要C++中的std::vector,而是想问下能否在ti.kernel和ti.func中声明数组,如a[10] 这样的,存在于栈中的数组,因为python本身不支持静态定长的数组。taichi在设计的时候有没有考虑到这种需求呢?

这个问题是来自于~~~近期我正在尝试把以前用CUDA写的程序用taichi重写,但是碰到了局部变量数组不知道怎么用taichi实现~

1 个赞

我也有这个需求,想要一个类似于std::array的数组,翻了一下文档,目前最接近的是ti.ndarray,但是ti.ndarray不能在太极作用域中使用,会报错。

Traceback (most recent call last):
  File "C:\Program Files\Python310\lib\site-packages\taichi\lang\ast\ast_transformer_utils.py", line 25, in __call__
    return method(ctx, node)
  File "C:\Program Files\Python310\lib\site-packages\taichi\lang\ast\ast_transformer.py", line 521, in build_Call
    node.ptr = func(*args, **keywords)
  File "C:\Program Files\Python310\lib\site-packages\taichi\lang\util.py", line 295, in wrapped
    assert in_python_scope(), \
AssertionError: ndarray cannot be called in Taichi-scope

不知道以后太极会不会支持在太极函数中使用ti.ndarray?

HI @cflw, 目前ndarray可以作为参数传递到太极函数中使用。

import taichi as ti
ti.init()

a = ti.ndarray(ti.f32, 10)

@ti.func
def compute_sum(a: ti.types.ndarray()): # 必须加type hints,否则报错
    sum = 0.0
    for i in range(10):
        sum += a[i]
    return sum

@ti.kernel
def init(a: ti.types.ndarray()):
    for i in range(10):
        a[i] = i
    sum = compute_sum(a)
    print(sum)

init(a)
1 个赞

现在taichi可以在栈上分配数组了吗?在一些算法里这真的很重要

现在taichi的vector和matrix已经可以接受动态的下标了,应该可以当做栈上的小数组使用

1 个赞

感谢,不过感觉现在taichi虽然解决了栈上分配数组的问题,但是类型不太灵活,如果需要向量数组就需要声明一个二维vector或matrix,读写有点繁琐