hua_ji233 2023-12-04 11:13 采纳率: 0%
浏览 34
已结题

cuda.jit加速报错

python报错:
我在使用numba中的cuda.jit加速时,函数出现如下报错:
numba.core.errors.TypingError: Failed in cuda mode pipeline (step: nopython frontend)
non-precise type array(pyobject, 0d, C)
During: typing of argument at D:\big_num_calculating\calculating.py (31)

File "calculating.py", line 31:

@cuda.jit

其中代码的第31行为:@cuda.jit

报错的函数代码块为:

from numba import cuda
import math
A = 712109216148475924002260208280426602040082602280
A_device = cuda.to_device(A)
B = 969363330882741444824008280206888408688882266224
B_device = cuda.to_device(B)
P_point_x = 652884557691898644204408046028266446228466204200
P_point_x_device = cuda.to_device(P_point_x)
Q_A_point_x = 242592654818097002466006644842440682466444846404
Q_A_point_x_device = cuda.to_device(Q_A_point_x)
p_y = 0
Q_y = 1
# p = 1004782375664996008484828206862404846062606288466
p = 2*10**6
p_device = cuda.to_device(p)
threads_per_block = 1024
blocks_per_grid = math.ceil(p / threads_per_block)

@cuda.jit
def P_yy(p, x):
    idx = cuda.threadIdx.x + cuda.blockDim.x * cuda.blockIdx.x
    if idx < p:
        for k in range(0, p):
            if (k ** 2) % p == (x ** 3 + A_device * x + B_device) % p:
                return k
            else:
                continue

if __name__ == "__main__":
    start_time = time.time()

   
    P_point_y = P_yy[blocks_per_grid, threads_per_block](p_device, P_point_x_device)
    cuda.synchronize()
  • 写回答

12条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2023-12-04 11:17
    关注
    获得0.75元问题酬金

    引自强大而免费的微信小程序:皆我百晓生

    这个报错是因为Numba无法推断出函数P_yy的返回类型。在Numba中,cuda.jit函数需要指定返回类型,以便在编译时生成正确的CUDA代码。你可以尝试修改代码,将返回类型添加到函数定义中。以下是可能的解决方法:

    @cuda.jit
    def P_yy(p, x) -> int:
        ...
    

    int替换为你期望的返回类型。这样,Numba就能正确地进行类型推断并生成CUDA代码。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月12日
  • 赞助了问题酬金15元 12月4日
  • 创建了问题 12月4日