最近用python写了一个numba.cuda来实现矩阵相乘和求逆的代码,但是在编译时出现了错误。
报错内容如下图所示:
代码如下:
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 模块中,以使它能够被正确访问。