Vineyo
October 4, 2021, 8:07am
#1
代码如下:
import taichi as ti
ti.init(arch=ti.opengl)
tiField = ti.Vector.field(2, dtype=float, shape=2)
tiField[0]=ti.Vector([0,1])
@ti.kernel
def foo():
for P in ti.grouped(tiField):
tiField[P]=ti.Vector([1,0])
foo()
print(tiField[0])
arch=ti.cuda 时程序会显示 [1. 0.],当 arch=ti.opengl 时会报错:
发生异常: RuntimeError
invalid unordered_map<K, T> key
File “…\test.py”, line 19, in
foo()
这是bug还是特性,如果是特性的话如果我想用OpenGL该怎么做?
UPDATE
之前的代码没有贴全,以下是可以复现问题的代码。
import taichi as ti
ti.init(arch=ti.opengl)
tiField = ti.Vector.field(2, dtype=float, shape=2)
tiField[1]=ti.Vector([0,1])
tiField2 = ti.Vector.field(2, dtype=float, shape=2)
@ti.kernel
def foo():
for P in ti.grouped(tiField):
tiField[P]=ti.Vector([1,0])
foo()
print(tiField[1])
0xzhang
October 5, 2021, 11:48am
#2
# opengl
[Taichi] version 0.7.32, llvm 10.0.0, commit 6652f94f, win, python 3.8.3
[Taichi] Starting on arch=opengl
[1. 0.]
# cuda
[Taichi] version 0.7.32, llvm 10.0.0, commit 6652f94f, win, python 3.8.3
[Taichi] Starting on arch=cuda
[1. 0.]
我使用 cuda 和 opengl 都可以运行,是否与版本有关?
Vineyo
October 5, 2021, 12:01pm
#3
可能是版本问题了,我的版本是
[Taichi] version 0.8.1, llvm 10.0.0, commit cc2dd342, win, python 3.9.6
0xzhang
October 11, 2021, 2:50pm
#4
Getting Started | Taichi Docs
Currently, Taichi only supports Python 3.6/3.7/3.8 (64-bit).
应该是Python版本过高了,我昨天在Windows下安装了Python 3.10,就不能使用Taichi了。现在使用3.8.10是正常的。
Vineyo
October 11, 2021, 3:08pm
#5
我用3.8.10也不行
[Taichi] version 0.8.1, llvm 10.0.0, commit cc2dd342, win, python 3.8.10
[TaiGLSL] version 0.0.11
[Taichi] Starting on arch=opengl
难道是我不应该用虚拟环境吗
0xzhang
October 11, 2021, 3:19pm
#7
# Windows
[Taichi] version 0.8.1, llvm 10.0.0, commit cc2dd342, win, python 3.8.10
[Taichi] Starting on arch=opengl
[1. 0.]
# WSL
[Taichi] version 0.8.1, llvm 10.0.0, commit cc2dd342, linux, python 3.8.10
[W 10/11/21 23:15:03.538 6935] [__init__.py:adaptive_arch_select@953] Arch=[<Arch.opengl: 7>] is not supported, falling back to CPU
[Taichi] Starting on arch=x64
[1. 0.]
我是使用Windows和WSL,都可以运行,WSL找不到GPU就切换到CPU了。
虚拟环境确实可能存在问题,多数显卡都是不支持虚拟化的吧。
Vineyo
October 11, 2021, 3:29pm
#8
我说的虚拟环境只是python的venv,而且我试了下系统路径的python也不行。这个问题不是说用不了opengl,而是用opengl就不能在python scope对field赋值然后又在tichi scope里读写,不在python scope赋值的话就没问题
0xzhang
October 12, 2021, 12:15am
#9
发现GitHub上已经有issue,确认存在的问题了。
opened 08:15AM - 27 Sep 21 UTC
closed 01:21AM - 28 Sep 21 UTC
potential bug
I find the following code not working when choosing `arch=ti.opengl` on Taichi 0… .8.0
``` python
import taichi as ti
ti.init(arch=ti.gpu)
tiField = ti.Vector.field(2, dtype=float, shape=2)
tiField[0] = ti.Vector([0,0])
tiField[1] = ti.Vector([1,1])
m=ti.Vector.field(2,dtype=int,shape=9)
@ti.kernel
def foo():
for P in ti.grouped(m):
tiField[P][0]=0
tiField[P][1]=1
foo()
print(tiField[0])
```
The code works with `ti.cpu` and `ti.cuda`, but not for `ti.opengl`. It generates the following error:
```
[Taichi] version 0.8.0, llvm 10.0.0, commit 181c9039, win, python 3.8.10
[Taichi] Starting on arch=opengl
Traceback (most recent call last):
File "c:\Users\Tiantian\Downloads\WeChat Files\ltt1598\FileStorage\File\2021-09\test(1).py", line 17, in <module>
foo()
File "C:\Users\Tiantian\AppData\Local\Programs\Python\Python38\lib\site-packages\taichi\lang\kernel_impl.py", line 678, in wrapped
return primal(*args, **kwargs)
File "C:\Users\Tiantian\AppData\Local\Programs\Python\Python38\lib\site-packages\taichi\lang\kernel_impl.py", line 606, in __call__
return self.compiled_functions[key](*args)
File "C:\Users\Tiantian\AppData\Local\Programs\Python\Python38\lib\site-packages\taichi\lang\kernel_impl.py", line 563, in func__
t_kernel(launch_ctx)
RuntimeError: invalid unordered_map<K, T> key
```
It's also worth mentioning that `ti.gpu` falls back to `ti.opengl` on my laptop without a graphics card, producing the same error.
1 Like
YuPeng
October 12, 2021, 7:13am
#10
@Vineyo 可以尝试下面的代码么?
import taichi as ti
ti.init(arch=ti.opengl)
tiField = ti.Vector.field(2, dtype=float, shape=2)
@ti.kernel
def foo():
tiField[0]=ti.Vector([0,1])
for P in ti.grouped(tiField):
tiField[P]=ti.Vector([1,0])
foo()
print(tiField[0])
Vineyo
October 12, 2021, 7:40am
#11
试了一下可以运行。我又试了一下把 tiField[0]=ti.Vector([0,1]) 移到python scope也可以。是我复制代码的时候漏了,应该是下面这段代码不能运行:
import taichi as ti
ti.init(arch=ti.opengl)
tiField = ti.Vector.field(2, dtype=float, shape=2)
tiField[1]=ti.Vector([0,1])
tiField2 = ti.Vector.field(2, dtype=float, shape=2)
@ti.kernel
def foo():
for P in ti.grouped(tiField):
tiField[P]=ti.Vector([1,0])
foo()
print(tiField[1])
这段代码是测试过了,原原本本复制过来的。应该是赋值后又声明了一个field就不行。
YuPeng
October 12, 2021, 7:44am
#12
嗯嗯,问题应该就出在
OpenGL后端上,Kernel 调用之后不能再定义field
这个问题上了。
BTW, 你可以把第一个Post的代码也更新一下么?之前的代码以为不是说的这个问题导致的。
2 Likes