【发布时间】:2019-10-17 14:19:09
【问题描述】:
我正在尝试将用户的@rkp solution 实现为他们自己的question,以了解如何使用pycuda 库加速与cython 的稀疏矩阵乘法(请注意这是他们在帖子中的第二个解决方案)。
在安装 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,但没有任何成功或信心我做得正确。
请问有什么解决办法吗?
【问题讨论】:
-
@Tony 我怀疑我会深入了解这一点(不确定我是否设置了 CUDA...)但是:如果您查看the relevant pyx code,它正在尝试创建一个零数组,所以我怀疑它的大小应该是一个整数时是一个浮点数。我猜
thread_count或max_thread_costs之一是浮点数(可能是后者)。thread_count来自pycuda.tools.DeviceData().max_threads,因此很容易调查。max_thread_costs有点难以追踪。也许编辑 packeted.py 以添加一些打印语句? -
@Tony 如果您更改了 pyx 代码,那么您需要重新编译它以检查更改是否生效。您可能会发现更改使用它的 Python 代码会更容易
-
@DavidW 谢谢,我会尝试仔细编辑,看看我能从中得到什么。你能详细说明你的最后评论吗?我正在做的只是进入
.py模块,例如。packeted.py,编辑并保存。这还不够吗? -编辑:抱歉,刚刚意识到你是专门为.pyx说话的 -
“更改 .py,编辑然后保存”工作正常。如果您要更改 .pyx,则需要使用 Cython 进行 be 进程,然后使用 C 进行编译。这并不难,但如果可以的话,只更改 .py 文件肯定更容易。
-
@DavidW 绝对正确。
max_thread_costs来自max_thread_costs = np.max(thread_costs),而thread_costs是<class 'numpy.ndarray'>的type'numpy.float64'0.0s