同样的代码,cuda可以运行而OpenGL不行

代码如下:

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])
# 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 都可以运行,是否与版本有关?

可能是版本问题了,我的版本是

[Taichi] version 0.8.1, llvm 10.0.0, commit cc2dd342, win, python 3.9.6

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是正常的。

我用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

难道是我不应该用虚拟环境吗

# 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了。
虚拟环境确实可能存在问题,多数显卡都是不支持虚拟化的吧。

我说的虚拟环境只是python的venv,而且我试了下系统路径的python也不行。这个问题不是说用不了opengl,而是用opengl就不能在python scope对field赋值然后又在tichi scope里读写,不在python scope赋值的话就没问题

发现GitHub上已经有issue,确认存在的问题了。

1 个赞

@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])

试了一下可以运行。我又试了一下把 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就不行。

嗯嗯,问题应该就出在

OpenGL后端上,Kernel 调用之后不能再定义field

这个问题上了。

BTW, 你可以把第一个Post的代码也更新一下么?之前的代码以为不是说的这个问题导致的。

2 个赞

好像过太久了编辑不了了