Numba SVML включен, но «не может векторизовать из-за конфликтов памяти» при умножении матрицы на вектор ⇐ Python

Программы на Python
Anonymous
Numba SVML включен, но «не может векторизовать из-за конфликтов памяти» при умножении матрицы на вектор

Сообщение Anonymous »

Я пытаюсь оптимизировать простую функцию умножения матрицы на вектор с помощью Numba, используя SVML. Однако при проверке векторизации SVML с помощью python test.py | grep svml, LLVM сообщает: «Невозможно векторизовать из-за конфликтов памяти». Я проверил, что SVML работает, и код из этой проблемы GitHub может успешно обнаруживать инструкции SVML.
Вот минимальный пример, воспроизводящий проблему:

Код: Выделить всё

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]))
Ошибка LLVM:

Код: Выделить всё

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

Вернуться в «Python»