Я пытаюсь реализовать пользовательское @rkp решение для собственного вопроса о том, как ускорить разреженные умножения матриц с помощью Cython с помощью библиотеки pycuda
(обратите внимание, этоих второе решение в их посте).
После установки pycuda
, pymetis
и т. Д. И запуска их точно такого же кода (в IDLE Python 3.5.2) я получаю:
TypeError: 'numpy.float64' object cannot be interpreted as an integer
Получается (воспроизводимо)часть, которая производит эту ошибку:
import numpy as np
import pycuda.autoinit
import pycuda.driver as drv
import pycuda.gpuarray as gpuarray
from pycuda.sparse.packeted import PacketedSpMV
from pycuda.tools import DeviceMemoryPool
from scipy.sparse import csr_matrix
COUNT = 100
N = 5000
P = 0.1
DTYPE = np.int32
#construct objects
np.random.seed(0)
a_dense = np.random.rand(N, N).astype(DTYPE)
a_dense[np.random.rand(N, N) >= P] = 0
a_sparse = csr_matrix(a_dense)
#PacketedSpMV produces the error
spmv = PacketedSpMV(a_sparse, is_symmetric=False, dtype=DTYPE)
И полная ошибка:
Traceback (most recent call last):
File "C:/Users/svobodov/Desktop/data/tests/cython/t.py", line 23, in <module>
spmv = PacketedSpMV(a_sparse, is_symmetric=False, dtype=DTYPE)
File "C:\Python35\lib\site-packages\pycuda\sparse\packeted.py", line 185, in __init__
local_row_costs)
File "pkt_build_cython.pyx", line 22, in pycuda.sparse.pkt_build_cython.build_pkt_data_structure
TypeError: 'numpy.float64' object cannot be interpreted as an integer
Сначала я думал, что это ошибка двойной точности, связанная с Cython, но это, очевидно, что-то другоепоскольку он ожидает целое число, а не float32
..
, я попытался настроить pkt_build_cython.pyx
, но без какого-либо успеха или уверенности, что я сделал это правильно.
Есть идеи, как решить эту проблему, пожалуйста?