Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 矩阵向量乘法_Python_Numpy_Cuda_Numba_Numba Pro - Fatal编程技术网

Python 矩阵向量乘法

Python 矩阵向量乘法,python,numpy,cuda,numba,numba-pro,Python,Numpy,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 n = 100 @cuda.jit('void(float32[:,:], float32[:], float32[:])') def cu_matrix_vector(A, b, c):

我尝试使用numbapro编写一个简单的矩阵向量乘法,如下所示:

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

n = 100

@cuda.jit('void(float32[:,:], float32[:], float32[:])')
def cu_matrix_vector(A, b, c):
    y, x = cuda.grid(2)
    if y < n:
        c[y] = 0.0

    if x < n and y < n:
        for i in range(n):
            c[y] += A[y, i] * b[i]


A = np.array(np.random.random((n, n)), dtype=np.float32)
B = np.array(np.random.random((n, 1)), 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(dA, dB, dC)
dC.to_host()

e = time()
tcuda = e - s
从numbapro导入cuda
从一个进口*
将numpy作为np导入
输入数学
从timeit导入默认的\u计时器作为时间
n=100
@jit('void(float32[:,:],float32[:],float32[:]))
def cu_矩阵_向量(A、b、c):
y、 x=cuda.grid(2)
如果y
但我得到了以下错误:

numbapro.cudadrv.error.CUDADRIVERROR:CUDA\u错误\u启动\u复制内存D->H失败


我不明白为什么设备到主机的拷贝失败了。请帮助

您的代码有多个问题

  • B和C向量是Nx1 2D矩阵,而不是1D向量,但内核的类型签名将它们列为“float32[:]”--1D向量。它还使用单个索引对它们进行索引,这会导致GPU上的运行时错误,因为访问不正确(
    cuda memcheck
    是您的朋友!)
  • 您的内核假设一个2D网格,但只使用其中的一列——这意味着许多线程执行相同的计算并相互覆盖
  • 没有给出执行配置,因此NumbaPro正在启动一个内核,其中包含1个线程的1个块。(
    nvprof
    是您的朋友!)
  • 下面是一个有效的代码。请注意,这将使用由1D块组成的1D网格,并在矩阵的列上循环。因此,它针对向量/矩阵中的行数较大的情况进行了优化。针对短而宽的矩阵进行优化的内核需要使用另一种方法(并行缩减)。但我会使用CUBLAS
    sgemv
    (它也在NumbaPro中公开)

    从numbapro导入cuda
    从一个进口*
    将numpy作为np导入
    输入数学
    从timeit导入默认的\u计时器作为时间
    m=100000
    n=100
    @jit('void(f4[:,:],f4[:],f4[:]))
    def cu_矩阵_向量(A、b、c):
    行=cuda.grid(1)
    如果(行
    即使进行了编辑,我仍然会遇到同样的错误。具体错误是:回溯(最近一次调用last):dC.to_host()中文件“matrixVector.py”第34行中的文件“”第1行未能复制内存D->hyu是正确的。实际上还有更多的问题——我重写了我的答案。
    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
    
    e = time()
    tcuda = e - s