CuPy v10以上版本中使用cuda.compile_with_cache方法,在get_function时报错AttributeError:‘NoneType’ object has no attribute ‘get_function’,可以使用cupy.RawKernel来替换compile_with_cache。
问题描述
当我们想要使用cupy对代码进行加速时,一种可行的做法是,首先定义函数名字符串strFunction,和cpp代码字符串strKernel:
import cupy
strFunction = 'test_func'
strKernel = '''
extern "C" __global__ void test_func(
const int n,
const float* input,
float* output
) {
xxx...
xxx...
xxx...
}
'''
然后利用cuda.compile_with_cache将strKernel中的代码进行编译,得到调用接口:
cupy_krl = cupy.cuda.compile_with_cache(strKernel)
cupy_launchr = cupy_krl.get_function(strFunction )
然后即可使用该函数:
output = cupy_launchr( grid,
block,
shared_mem,
args=[xxx, xxx, xxx...])
但是在CuPy v10以上版本中,可能会报错:
Traceback (most recent call last):
File "<string>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'get_function'
原因
这是由于在CuPy v10及其之后的版本中,cupy.cuda.compile_with_cache方法已经被弃用了。
解决方案
一个可行的解决方案是使用cupy.RawKernel替换cupy.cuda.compile_with_cache,即将下列代码
cupy_krl = cupy.cuda.compile_with_cache(strKernel)
cupy_launchr = cupy_krl.get_function(strFunction )
替换为
cupy_launchr = cupy.RawKernel(strKernel, strFunction)
即可在CuPy v10以上版本中使用。