Вот минимальный пример, воспроизводящий проблему:
Код: Выделить всё
import numpy as np
import numba
import llvmlite.binding as llvm
llvm.set_option("", "--debug-only=loop-vectorize")
@numba.njit(parallel=True, fastmath=True)
def njit_generate_data(y, S, x, noise, n_observation, support, noise_level=0.1):
x[support] = np.random.randn(len(support))
for i in numba.prange(n_observation):
y[i] = S[i] @ x + noise[i] * noise_level
return S, x, y
i8 = numba.types.int8
f32 = numba.types.float32
b = numba.types.bool_
njit_generate_data.compile((f32[:], f32[:, :], f32[:], f32[:], i8, b[:], f32))
print(njit_generate_data.inspect_asm(njit_generate_data.signatures[0]))
Код: Выделить всё
LV: Can't vectorize due to memory conflicts
- Python 3.10
- Нумба 0.60.0
- вывод:
Код: Выделить всё
numba -s | grep SVML
Код: Выделить всё
__SVML Information__ SVML state, config.USING_SVML : True SVML library found and loaded : True llvmlite using SVML patched LLVM : True SVML operational : True
[*]Удален диапазон распараллеливания
[*]Расширенное умножение матриц вручную (я думал, это сработает, но не сработало)
[*]Переключение параллельного = True /False и fastmath=True/False
[*]Добавление непрерывного массива для x, y и S в соответствии с этим вопросом
Может ли я упустить что-нибудь из логики векторизации в Numba или LLVM, что могло бы вызвать этот конфликт?
Подробнее здесь: https://stackoverflow.com/questions/790 ... trix-vecto