【问题标题】:cython float64 error although float32 specifically setcython float64 错误虽然 float32 专门设置
【发布时间】:2019-10-17 14:19:09
【问题描述】:

我正在尝试将用户的@rkp solution 实现为他们自己的question,以了解如何使用pycuda 库加速与cython 的稀疏矩阵乘法(请注意这是他们在帖子中的第二个解决方案)。

在安装 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,但没有任何成功或信心我做得正确。

请问有什么解决办法吗?

【问题讨论】:

  • @Tony 我怀疑我会深入了解这一点(不确定我是否设置了 CUDA...)但是:如果您查看the relevant pyx code,它正在尝试创建一个零数组,所以我怀疑它的大小应该是一个整数时是一个浮点数。我猜thread_countmax_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&lt;class 'numpy.ndarray'&gt;type 'numpy.float64' 0.0s

标签: python cython pycuda


【解决方案1】:

正如 cmets 中所确定的,这是 PyCUDA 代码库的内部例程中缺少整数转换的结果。

这个错误实际上是fixed in 2018,所以如果你使用任何 PyCUDA 2019 版本,你应该有更正的代码,这个问题应该不会发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 2015-01-14
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    相关资源
    最近更新 更多