numba中cuda.local.array()报错

最近用python写了一个numba.cuda来实现矩阵相乘和求逆的代码,但是在编译时出现了错误。
报错内容如下图所示:

img

代码如下:

from numba import cuda, float32
import math
from gputools import gpuset as gset


@cuda.jit(device=True)
def Mutmul(matrix_a, matrix_b, tpb):
    length = len(matrix_a) // tpb * len(matrix_b) // tpb
    matrix_c = cuda.local.array(shape=length, dtype=float32)
    for i in range(length):
        tmp = 0
        for k in range(tpb):
            tmp = tmp + matrix_a[i * tpb + k] * matrix_b[k * tpb + i]
        matrix_c[i] = tmp
    return matrix_c


@cuda.jit(device=True)
def inverse(matrix, tpb):
    length = tpb * tpb
    resmat = cuda.local.array(length, float32)
    for i in range(length):
        if i % tpb == i // tpb:
            resmat[i] = 1
        else:
            resmat[i] = 0

    for i in range(tpb):
        if matrix[i * tpb + i] == 0:
            for j in range(i+1, tpb):
                if matrix[j * tpb + i] == 0:
                    continue
                else:
                    for k in range(tpb):
                        matrix[i * tpb + i] = (matrix[i * tpb + i] + matrix[j * tpb + k]) / matrix[j * tpb + i]
                        resmat[i * tpb + i] = (resmat[i * tpb + i] + resmat[j * tpb + k]) / matrix[j * tpb + i]
                    break
        else:
            for j in range(tpb):
                matrix[i * tpb + j] = matrix[i * tpb + j] / matrix[i * tpb + i]
                resmat[i * tpb + j] = resmat[i * tpb + j] / matrix[i * tpb + i]

        for j in range(i+1, tpb):
            tmp = matrix[j * tpb + i]
            for k in range(i, tpb):
                matrix[j * tpb + k] = matrix[j * tpb + k] - matrix[i * tpb + k] * tmp
                resmat[j * tpb + k] = resmat[j * tpb + k] - resmat[i * tpb + k] * tmp

    for i in range(tpb-1, -1, -1):
        for j in range(i-1, -1, -1):
            tmp = matrix[j * tpb + i]
            for k in range(i, tpb):
                matrix[j * tpb + k] = matrix[j * tpb + k] - matrix[i * tpb + k] * tmp
                resmat[j * tpb + k] = resmat[j * tpb + k] - resmat[i * tpb + k] * tmp
    return resmat

@cuda.jit()
def mat_test(matrix_a, matrix_b, tpb, matrix_x, matrix_y):
    i = cuda.blockIdx.x
    j = cuda.threadIdx.x
    idx = j + i * cuda.blockDim.x
    if idx < tpb * tpb:
        matrix_c = Mutmul(matrix_a, matrix_b, tpb)
        matrix_i = inverse(matrix_c, tpb)
        matrix_x[idx] = matrix_c[idx]
        matrix_y[idx] = matrix_i[idx]

def main():
    matrix_a = np.array([1., 2., 3., 4., 5., 6., 7., 8., 9.])
    matrix_b = np.array([1., 2., 3., 4., 5., 6., 7., 8., 9.])
    matrix_a = cuda.to_device(matrix_a)
    matrix_b = cuda.to_device(matrix_b)
    tpb = 3
    matrix_c = cuda.device_array(tpb*tpb, dtype=np.float64)
    matrix_i = cuda.device_array(tpb*tpb, dtype=np.float64)
    block_size = 20
    grid_size = 18
    gpufunc.mat_test[grid_size, block_size](matrix_a, matrix_b, tpb, matrix_c, matrix_i)
    resmat1 = matrix_c.copy_to_host()
    resmat2 = matrix_i.copy_to_host()

刚刚接触cuda编程,希望有人能指点一二。

回答不易,求求您采纳点赞哦 感激不尽

根据你提供的代码,可能有以下几个问题:

  • 在代码中,有一个 gpuset 模块的导入语句,但是这个模块在标准的 Numba 库中是不存在的。如果这个模块是一个自定义的模块,你需要确保它已正确安装并能够被访问。

  • 在 inverse 函数中,存在一个错误。在这行代码中:resmat = cuda.local.array(length, float32),应该在 float32 后面添加一个逗号,使它变成 float32,,否则 Numba 可能无法正确解析这个参数。

  • 在 mat_test 函数中, Mutmul 和 inverse 函数是被 cuda.jit(device=True) 修饰的设备函数,这意味着它们只能在设备上执行,而不能在主机上执行。然而,在 mat_test 函数中,你在主机上调用了这些函数。你需要把这些函数改成被 cuda.jit() 修饰的核函数,这样它们才能在设备上执行。

  • 在 mat_test 函数中,你在循环中重复地调用 Mutmul 和 inverse 函数,这可能会导致性能问题。你可以尝试把这些函数调用提到循环外部,这样可以减少函数调用的开销,提高代码效率。

  • 最后,在 main 函数中,你使用了 gpufunc 变量来调用 mat_test 函数,但是在代码中并没有定义 gpufunc 变量。你需要修改这个变量的名称,或者将 mat_test 函数添加到 gpuset 模块中,以使它能够被正确访问。