import taichi as ti
ti.init(debug = True)
a = ti.field(dtype = ti.f32)
ti.root.pointer(ti.ij, (5, 5)).place(a)
for i, j in ti.ndrange(3, 3):
a[i,j] = 1.0
@ti.kernel
def fun():
for i, j in a:
print(a[i,j])
fun()
我是用CPU做后端的,所以用的应该是内存。请问这个计算为什么是乘以16 x 4呢?是说一个元素要占64 byte的意思吗。。我按照64位浮点数直接换算的话,一个浮点数8个byte,一共也就是10000 x 10000 x 8 = 8 x 10e8 = 800MB的样子,不太懂为什么这样就会报错。
另外,不同的SNode好像也会占不同的空间的样子,ti.root.pointer似乎可以放置的比ti.root.bitmasked少,这两者放置时占据的空间分别应该怎么计算?
import sys
import os
import taichi as ti
import time
import math
import numpy as np
ti.init(arch=ti.cpu,advanced_optimization=True)
imgSize = 512
screenRes = ti.Vector([imgSize, imgSize])
img = ti.Vector(3, dt=ti.f64, shape=[imgSize,imgSize])
gui = ti.GUI('test', res=(imgSize,imgSize))
#a = ti.field(dtype=ti.f64)
#ti.root.pointer(ti.ij, (12000, 12000)).place(a)
a = ti.var(dt=ti.f64, shape=[12000,12000])
@ti.kernel
def render():
for i, j in a:
a[i,j] = ti.random()
for i, j in img:
img[i,j].fill(a[i,j])
while gui.running:
render()
gui.set_image(img.to_numpy())
gui.show()
谢谢帮助测试,我也发现了声明成稠密矩阵没有问题(一定大小之内,大约是3w x 3w)。声明稀疏本身也不会有问题,就是写访问这个稀疏矩阵的时候,当矩阵size超过一定大小就会报错。
import taichi as ti
ti.init(default_fp=ti.f64)
# 这样就会导致后面报错
a = ti.field(dtype=ti.f64)
ti.root.pointer(ti.ij, (12000, 12000)).place(a)
# 这样不会爆炸
# a = ti.field(dtype=ti.f64, shape=(12000, 12000))
@ti.kernel
def init():
for i, j in ti.ndrange(2, 2):
a[i, j] = 1
# 这个函数当a超过一定大小就会出错
@ti.kernel
def printa():
for i, j in a:
print(a[i, j])
init()
printa()