NUMBA: опережающие проблемы - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь использовать numba , чтобы ускорить медленный расчет.Он прекрасно работает с декоратором @njit, но мне действительно нужно, чтобы он работал как предварительно скомпилированный опережающий модуль (AOT).К сожалению, я не смог заставить его работать.Вот код, который я использую для компиляции AOT-модуля:

from numba.pycc import CC
import numpy as np

cc = CC('window_cloud_scores')
cc.verbose = True
cc.output_dir='/cache'
cc.output_file='window_cloud_scores.so'


@cc.export('run', 'f8[:,:](u1[:,:], i4)')
def run(clouds,window):
    r=int(window/2)
    assert clouds.ndim==2
    assert clouds.shape[0]==clouds.shape[1]
    rows,cols=clouds.shape
    score_map=np.full(clouds.shape,-1)
    scores=[]
    for j in range(r,rows-r):
        score_cols=[]
        for i in range(r,cols-r):
            clouds_window=clouds[j-r:j+r+1,i-r:i+r+1]
            score_cols.append(clouds_window.mean())
        scores.append(score_cols)
    return np.array(scores)


if __name__ == "__main__":
    cc.compile()

Когда я компилирую модуль, он создает файл window_cloud_scores.so, но выдает следующее предупреждение:

/Пользователи /.../ lib / python3.6 / site-packages / numba / pycc /../ runtime / _nrt_python.c: 234: 55: предупреждение: несовместимые типы указателей, передающие PyTypeObject * (также известный как struct _typeobject * ')) к параметру типа 'PyObject *' (также известный как struct _object ') [-Wincompatible-pointer-types] mi = (MemInfoObject ) PyObject_CallFunctionObjArgs (& MemInfoType, addr, NULL);^ ~~~~~~~~~~~ /Users/.../python3.6m/abstract.h:425:68: примечание: передача аргумента параметру 'callable' здесь PyAPI_FUNC (PyObject *) PyObject_CallFunctionObjArgs (PyObject *)вызываемый,

А потом, когда я пытаюсь запустить

import window_cloud_scores as wcs
wcs.run(...)

, я получаю segmentation fault: 11 в консоли python и это ноутбук jupyter, ядро ​​умирает.

И снова

@njit
def run(clouds,window):
    r=int(window/2)
    assert clouds.ndim==2
    assert clouds.shape[0]==clouds.shape[1]
    rows,cols=clouds.shape
    score_map=np.full(clouds.shape,-1)
    scores=[]
    for j in range(r,rows-r):
        score_cols=[]
        for i in range(r,cols-r):
            clouds_window=clouds[j-r:j+r+1,i-r:i+r+1]
            score_cols.append(clouds_window.mean())
        scores.append(score_cols)
    return np.array(scores)

Прекрасно работает. Мысли?

...