@artshelom

Python при использовании numba появляется ошибка не типизированного класса, как исправить?

У меня есть класс который отвечает за расчеты, мне нужно чтобы он в несколько поток считал большое кол-во данных.
Я решил это делать на GPU. Но при старте пишет ошибку:
spoiler
Compilation is falling back to object mode WITHOUT looplifting enabled because Function "exampleGPU" failed type inference due to: Untyped global name 'Slope0723': cannot determine Numba type of <class 'type'>

File "SlopeWithGPU.py", line 647:
def exampleGPU(dxC, dxK):
    <source elided>
    SurfaceSlope = [[0, 0], [20, 0], [120, 100], [140, 100]]
    return Slope0723().slopeCalculate(35, 2.5, 0.05, SurfaceSlope, 'red', dxC, dxK)
    ^

  @vectorize(['float32(float32, float32)'], target='parallel')
C:\Users\User\AppData\Local\Programs\Python\Python37-32\lib\site-packages\numba\compiler.py:742: NumbaWarning: Function "exampleGPU" was compiled in object mode without forceobj=True.

File "SlopeWithGPU.py", line 645:
@vectorize(['float32(float32, float32)'], target='parallel')
def exampleGPU(dxC, dxK):
^

  self.func_ir.loc))
C:\Users\User\AppData\Local\Programs\Python\Python37-32\lib\site-packages\numba\compiler.py:751: NumbaDeprecationWarning: 
Fall-back from the nopython compilation path to the object mode compilation path has been detected, this is deprecated behaviour.

For more information visit http://numba.pydata.org/numba-doc/latest/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit

File "SlopeWithGPU.py", line 645:
@vectorize(['float32(float32, float32)'], target='parallel')
def exampleGPU(dxC, dxK):
^

  warnings.warn(errors.NumbaDeprecationWarning(msg, self.func_ir.loc))
Traceback (most recent call last):
  File "C:/Users/User/Desktop/geomechanica/SlopeWithGPU.py", line 644, in <module>
    @vectorize(['float32(float32, float32)'], target='parallel')
  File "C:\Users\User\AppData\Local\Programs\Python\Python37-32\lib\site-packages\numba\npyufunc\decorators.py", line 123, in wrap
    return vec.build_ufunc()
  File "C:\Users\User\AppData\Local\Programs\Python\Python37-32\lib\site-packages\numba\npyufunc\ufuncbuilder.py", line 236, in build_ufunc
    dtypenums, ptr, env = self.build(cres, sig)
  File "C:\Users\User\AppData\Local\Programs\Python\Python37-32\lib\site-packages\numba\npyufunc\parallel.py", line 181, in build
    dtypenums.append(np.dtype(signature.return_type.name).num)
TypeError: data type "pyobject" not understood


Сам код:
@vectorize(['float32(float32, float32)'], target='parallel')
def exampleGPU(dxC, dxK):
    SurfaceSlope = [[0, 0], [20, 0], [120, 100], [140, 100]]
    return Slope0723().slopeCalculate(35, 2.5, 0.05, SurfaceSlope, 'red', dxC, dxK)

start_time = time.time()

for dxC in seq(4, 6, 0.01):
    for dxK in seq(1, 2, 0.01):
        SummC = exampleGPU((dxC, dxK))
        if(math.isnan(SummC) == False):
            print(SummC, ' self=', dxC, dxK)


Как можно запустить в несколько потоков на GPU?
  • Вопрос задан
  • 1164 просмотра
Пригласить эксперта
Ответы на вопрос 1
adugin
@adugin Куратор тега Python
1) В данный момент ваш код не имеет никакого отношения к GPU.
2) В вызове exampleGPU((dxC, dxK)) вы передаёте tuple, т.е. pyobject, а в соответствии с описанием в @vectorize ожидаются два float32: TypeError: data type "pyobject" not understood
3) Приводите весь код. Из этого куска ничего не понятно по типам и структурам данных.
4) Запихивать в векторизуемую функцию создание объекта и вызов внешней Python-функции (да ещё наверняка не векторизованной) - плохая практика: NumbaWarning: Function "exampleGPU" was compiled in object mode without forceobj=True
5) Рекомендую сначала разобраться с numpy. Судя по использованию модуля math, с numpy вы не дружите.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы