cython float64 错误虽然专门设置了 float32

cython float64 error although float32 specifically set

我正在尝试实现用户的@rkp solution to their own question 如何通过使用 pycuda 库来加速 cython 的稀疏矩阵乘法(请注意这是他们在 post).

安装 pycudapymetis 等和 运行 它们完全相同的代码后(在 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 但没有成功,也没有信心我做对了。

请问有什么解决办法吗?

如评论中所述,这是 PyCUDA 代码库的内部例程中缺少整数转换的结果。

该错误实际上是 fixed in 2018,因此如果您使用任何 PyCUDA 2019 版本,您应该拥有更正的代码并且应该不会发生此问题。