ti.types.vector维度指定问题

问题一:

import taichi as ti
ti.init(arch=ti.cpu)

@ti.data_oriented
class Particle:
    
    def __init__(self, N):
        self.N = N

    @ti.kernel
    def get_vec(self):
        vec = ti.types.vector(int(self.N/2), dtype=ti.f64)
        pair = vec([0.]*int(self.N/2))
        print(pair)
        
A = Particle(12)
A.get_vec()

上述代码在去掉@ti.kernel可以正常运行得到结果,加上以后报错如下:

TaichiTypeError: On line 12 of file "C:\Users\Administrator\AppData\Local\Temp\ipykernel_7448\407466583.py", in get_vec:
        vec = ti.types.vector(int(self.N/2), dtype=ti.f64)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Invalid constant scalar data type: <class 'taichi.lang.matrix.MatrixType'>

这个问题是为了获得可以指定类型的vecter, 请问应该如何处理?
问题二:

b = ti.field(dtype=ti.f64, shape=())
b[None] = 1.

@ti.kernel
def sumtest():
    a = 0.
    for i in range(10):
        a += b[None]
    print(a)
    
sumtest()

这段代码运行没有问题,也可以获得正确结果,但是会提示

Atomic add may lose precision: f32 <- f64

请问如何指定这个a这个临时变量类型为ti.f64? 感谢大家。

啊,我找到了,写ti.float64(0.0)就精度统一了。Vector里面也是,比如ti.Vector([ti.float64(0.)]*3),这样好像就都是f64精度的了。

问题 1,你需要把类型声明放到 kernel 外面来:

import taichi as ti
ti.init(arch=ti.cpu)

@ti.data_oriented
class Particle:
    def __init__(self, N):
        self.N = N
        self.vec = ti.types.vector(int(self.N/2), dtype=ti.f64)

    @ti.kernel
    def get_vec(self):
        pair = self.vec(0)
        print(pair)

A = Particle(12)
A.get_vec()

啊,懂了,感谢!