用cuda中的python计算矩阵向量乘法

时间:2017-04-27 09:03:59

标签: python-3.x cuda numba numba-pro

我正在尝试使用numbapro在下面编写一个简单的矩阵向量乘法:

from numbapro import cuda
from numba import *
import numpy as np
import math
from timeit import default_timer as time

m = 100000 
n = 100

@cuda.jit('void(f4[:,:], f4[:], f4[:])')
def cu_matrix_vector(A, b, c):
    row = cuda.grid(1)
    if (row < m):
        sum = 0

        for i in range(n):
            sum += A[row, i] * b[i]

        c[row] = sum

A = np.array(np.random.random((m, n)), dtype=np.float32)
B = np.array(np.random.random(m), dtype=np.float32)
C = np.empty_like(B)

s = time()
dA = cuda.to_device(A)
dB = cuda.to_device(B)
dC = cuda.to_device(C)

cu_matrix_vector[(m+511)/512, 512](dA, dB, dC)

dC.to_host()

print ( C)

但是当我开始运行时,我在函数中遇到错误** cu_matrix_vector **参数2 ::错误类型

  

cu_matrix_vector [(m + 511)/ 512,512](dA,dB,dC)     文件“C:\ Anaconda3 \ lib \ site-packages \ numba \ cuda \ compiler.py”,第359行,调用       sharedmem = self.sharedmem)     文件“C:\ Anaconda3 \ lib \ site-packages \ numba \ cuda \ compiler.py”,第433行,在_kernel_call中       cu_func(* kernelargs)     文件“C:\ Anaconda3 \ lib \ site-packages \ numba \ cuda \ cudadrv \ driver.py”,第1116行,致电       self.sharedmem,streamhandle,args)     在launch_kernel中输入文件“C:\ Anaconda3 \ lib \ site-packages \ numba \ cuda \ cudadrv \ driver.py”,第1160行       没有)     文件“C:\ Anaconda3 \ lib \ site-packages \ numba \ cuda \ cudadrv \ driver.py”,第221行,在safe_cuda_api_call中       retcode = libfn(* args)   ctypes.ArgumentError:参数2 ::错误类型

1 个答案:

答案 0 :(得分:1)

问题在于:

cu_matrix_vector[(m+511)/512, 512](dA, dB, dC)

在Python 3中,(m+511)/512 = 196.310546875。将浮点值作为启动参数传递是非法的,这是您看到的类型冲突错误的来源。你想做的事:

cu_matrix_vector[(m+511)//512, 512](dA, dB, dC)

将生成一个整数值,并允许代码正确运行。