0
点赞
收藏
分享

微信扫一扫

解决CuPy v10以上版本中cuda.compile_with_cache方法返回为None:‘NoneType‘ object has no attribute ‘get_function‘

沪钢木子 2022-01-08 阅读 129

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以上版本中使用。

举报
0 条评论