CUDA GPU 处理:TypeError: compile_kernel() got an unexpected keyword argument 'boundscheck'
Posted
技术标签:
【中文标题】CUDA GPU 处理:TypeError: compile_kernel() got an unexpected keyword argument \'boundscheck\'【英文标题】:CUDA GPU processing: TypeError: compile_kernel() got an unexpected keyword argument 'boundscheck'CUDA GPU 处理:TypeError: compile_kernel() got an unexpected keyword argument 'boundscheck' 【发布时间】:2020-09-10 22:13:55 【问题描述】:今天我开始使用 CUDA 和 GPU 处理。我找到了这个教程: https://www.geeksforgeeks.org/running-python-script-on-gpu/
不幸的是,我第一次尝试运行 gpu 代码失败了:
from numba import jit, cuda
import numpy as np
# to measure exec time
from timeit import default_timer as timer
# normal function to run on cpu
def func(a):
for i in range(10000000):
a[i]+= 1
# function optimized to run on gpu
@jit(target ="cuda")
def func2(a):
for i in range(10000000):
a[i]+= 1
if __name__=="__main__":
n = 10000000
a = np.ones(n, dtype = np.float64)
b = np.ones(n, dtype = np.float32)
start = timer()
func(a)
print("without GPU:", timer()-start)
start = timer()
func2(a)
print("with GPU:", timer()-start)
输出:
/home/amu/anaconda3/bin/python /home/amu/PycharmProjects/gpu_processing_base/gpu_base_1.py
without GPU: 4.89985659904778
Traceback (most recent call last):
File "/home/amu/PycharmProjects/gpu_processing_base/gpu_base_1.py", line 30, in <module>
func2(a)
File "/home/amu/anaconda3/lib/python3.7/site-packages/numba/cuda/dispatcher.py", line 40, in __call__
return self.compiled(*args, **kws)
File "/home/amu/anaconda3/lib/python3.7/site-packages/numba/cuda/compiler.py", line 758, in __call__
kernel = self.specialize(*args)
File "/home/amu/anaconda3/lib/python3.7/site-packages/numba/cuda/compiler.py", line 769, in specialize
kernel = self.compile(argtypes)
File "/home/amu/anaconda3/lib/python3.7/site-packages/numba/cuda/compiler.py", line 785, in compile
**self.targetoptions)
File "/home/amu/anaconda3/lib/python3.7/site-packages/numba/core/compiler_lock.py", line 32, in _acquire_compile_lock
return func(*args, **kwargs)
TypeError: compile_kernel() got an unexpected keyword argument 'boundscheck'
Process finished with exit code 1
我已经在pycharm的anaconda环境中安装了教程中提到的numba
和cudatoolkit
。
【问题讨论】:
您从该教程中复制的代码是错误的并且不起作用。我的建议是找到更好的教程 考虑改用 C/C++,按照这里的官方教程:developer.nvidia.com/how-to-cuda-c-cpp 总结一下——“优化为在 gpu 上运行的函数”可能应该用@vectorize
装饰器而不是 @jit
装饰。后者意味着您正在编写一个 CUDA 内核,在这种情况下,函数内的代码和函数调用本身都需要进行重大更改
@Hack06:鉴于这基本上是一个 Python 加速练习,这似乎不是特别有用或建设性的建议。
问题是用python标记的,代码是python,还有一个关于用numba加速python的教程的链接。它需要变得多明显?
【参考方案1】:
添加答案以将其从未回答队列中删除。
该示例中的代码已损坏。您的 numba 或 CUDA 安装没有任何问题。您问题中的代码(或您从中复制它的博客)不可能发出博客文章声称的结果。
可以通过多种方式对其进行修改以使其发挥作用。一个是这样的:
from numba import vectorize, jit, cuda
import numpy as np
# to measure exec time
from timeit import default_timer as timer
# normal function to run on cpu
def func(a):
for i in range(10000000):
a[i]+= 1
# function optimized to run on gpu
@vectorize(['float64(float64)'], target ="cuda")
def func2(x):
return x+1
if __name__=="__main__":
n = 10000000
a = np.ones(n, dtype = np.float64)
start = timer()
func(a)
print("without GPU:", timer()-start)
start = timer()
func2(a)
print("with GPU:", timer()-start)
这里func2
变成了一个为设备编译的ufunc。然后它将在 GPU 上的整个输入数组上运行。这样做会:
$ python bogoexample.py
without GPU: 4.314514834433794
with GPU: 0.21419800259172916
所以它更快,但请记住,GPU 时间包括编译 GPU ufunc 所花费的时间
另一种选择是实际编写 GPU 内核。像这样:
from numba import vectorize, jit, cuda
import numpy as np
# to measure exec time
from timeit import default_timer as timer
# normal function to run on cpu
def func(a):
for i in range(10000000):
a[i]+= 1
# function optimized to run on gpu
@vectorize(['float64(float64)'], target ="cuda")
def func2(x):
return x+1
# kernel to run on gpu
@cuda.jit
def func3(a, N):
tid = cuda.grid(1)
if tid < N:
a[tid] += 1
if __name__=="__main__":
n = 10000000
a = np.ones(n, dtype = np.float64)
for i in range(0,5):
start = timer()
func(a)
print(i, " without GPU:", timer()-start)
for i in range(0,5):
start = timer()
func2(a)
print(i, " with GPU ufunc:", timer()-start)
threadsperblock = 1024
blockspergrid = (a.size + (threadsperblock - 1)) // threadsperblock
for i in range(0,5):
start = timer()
func3[blockspergrid, threadsperblock](a, n)
print(i, " with GPU kernel:", timer()-start)
运行如下:
$ python bogoexample.py
0 without GPU: 4.885275377891958
1 without GPU: 4.748716968111694
2 without GPU: 4.902181145735085
3 without GPU: 4.889955999329686
4 without GPU: 4.881594380363822
0 with GPU ufunc: 0.16726416163146496
1 with GPU ufunc: 0.03758022002875805
2 with GPU ufunc: 0.03580896370112896
3 with GPU ufunc: 0.03530424740165472
4 with GPU ufunc: 0.03579768259078264
0 with GPU kernel: 0.1421878095716238
1 with GPU kernel: 0.04386183246970177
2 with GPU kernel: 0.029975440353155136
3 with GPU kernel: 0.029602501541376114
4 with GPU kernel: 0.029780613258481026
在这里您可以看到内核运行速度略快于 ufunc,并且缓存(这是 JIT 编译函数的缓存,而不是调用的记忆)显着加快了 GPU 上的调用。
【讨论】:
有效,但只要 python 执行行执行在@cuda
或@vectorize
下定义的任何函数,编译时间就会有 60 秒的延迟,显然 cuda 和 GPU 正在编译。 60 秒后,它如您所展示的那样完成,一切顺利通过。你能消除这个 60 秒的编译时间步骤吗?或者这是一个必要的邪恶?以上是关于CUDA GPU 处理:TypeError: compile_kernel() got an unexpected keyword argument 'boundscheck'的主要内容,如果未能解决你的问题,请参考以下文章
GPU/CUDA:网格的最大块数和每个多处理器的最大驻留块数
在 CUDA Unified Memory 多 GPU 或多处理器中使用原子算术运算