【发布时间】:2016-04-08 06:33:55
【问题描述】:
您能帮我理解如何用 Python 编写 CUDA 内核吗? AFAIK,numba.vectorize 可以基于 target 在 cuda、cpu、parallel(multi-cpus) 上执行。但target='cuda' 需要设置 CUDA 内核。
主要问题是互联网上的许多示例,答案都与已弃用 NumbaPro库有关,因此很难遵循诸如未更新 WIKIs,特别是如果你是新手。
我有:
- 最新版 Anaconda (v2)
- 最新的 Numba (v0.25)
- 最新的 CUDA 工具包 (v7)
这是我得到的错误:
numba.cuda.cudadrv.driver.CudaAPIError: 1 调用 cuLaunchKernel 导致 CU DA_ERROR_INVALID_VALUE
import numpy as np
import time
from numba import vectorize, cuda
@vectorize(['float32(float32, float32)'], target='cuda')
def VectorAdd(a, b):
return a + b
def main():
N = 32000000
A = np.ones(N, dtype=np.float32)
B = np.ones(N, dtype=np.float32)
start = time.time()
C = VectorAdd(A, B)
vector_add_time = time.time() - start
print "C[:5] = " + str(C[:5])
print "C[-5:] = " + str(C[-5:])
print "VectorAdd took for % seconds" % vector_add_time
if __name__ == '__main__':
main()
【问题讨论】:
-
您发布的代码没有问题。我可以毫无错误地运行它。我可以想到两种可能性-(a)您的 numba 安装完全损坏,或者(b)您的 GPU 内存很少。您正在设备上分配三个 128Mb 向量,如果 GPU 没有太多内存,您可能会用完。尝试将 N 减少到更小的值,看看会发生什么
-
@talonmies,哇,它在 N=1000 万时工作,在 2000 万时失败。您能告诉我您是如何计算出 3 x 128 Mb 的吗?我有 GeForce 820M,它的内存是 2Gb,我相信
-
32000000 * 4 = 128Mb。如果 GPU 运行显示器并且没有大量计算能力,您也可能会达到看门狗计时器的限制
-
@talonmies,谢谢,知道了。实际上,这段代码在 GPU 上的运行速度比在 CPU 上运行 target="cpu" VectorAdd 时慢:耗时 0.0160000324249 秒 GPU 上的 VectorAdd 耗时 0.695999860764 秒但我认为我安装了一些错误,因为“nvprof”表示“没有分析内核。 ",看来我根本不使用我的 GPU。
-
nvprof 问题并不意味着您的 GPU 没有被使用——它是。要使分析器工作,必须在程序退出之前调用特定的 CUDA API。这可能意味着内部 Numbapro 运行时不会在退出时调用该 API,因此分析器无法获取统计信息
标签: python cuda numba numba-pro