您的位置:首页 > 编程语言 > Python开发

终于成功配置numba cuda

2017-12-16 23:21 351 查看
很多年前就关注了numba,numba的gpu加速以前叫numba pro,是收费的,后来整合进了numba。但是很遗憾,我从来没有成功配置过numba的cuda。终于在今天,完成了这一多年来一直失败的配置过程。

numba cuda的配置

废话少说,配置cuda主要有以下几点:

安装CUDA Toolkit 我比较喜欢新的,装的是9.1版本。安装完成后安装程序会自动配置好环境变量。

设置numba所需的环境变量

NUMBAPRO_CUDALIB:path_to_cuda\bin (eg: D:\CUDA\v9.1\bin)

NUMBDPRO_NVVM: path_to_cuda\nvvm\bin\nvvm.dll (eg: D:\CppLib\CUDA\v9.1\nvvm\bin\nvvm64_32_0.dll)

NUMBAPRO_LIBDEVICE: path_to_cuda\nvvm\libdevice (eg: D:\CppLib\CUDA\v9.1\nvvm\libdevice)

环境变量设置好后看看NUMBAPRO_LIBDEVICE目录下是否有名为libdevice.compute_xx.10.bc (xx=20,30,35,50)的文件,如果没有可以到matlab的bin目录下去寻找。matlab里面啥都有。。啥都有。。啥都有。。

环境设置好以后就可以试试numba的example了。numba的example很简单,Mandelbrot集,链接如下:

https://github.com/harrism/numba_examples

其中使用cpu的
numba.autojit
无需配置,直接就能达到10倍以上的加速效果,而使用gpu的
numba.cuda.jit(device=True)
可以加速至上千倍。

探索过程:

在只安装了CUDA Toolkit的情况下直接运行上面的example会出现以下错误:

OSError                                   Traceback (most recent call last)
D:\WinPython-64bit-3.6.3.0Qt5\python-3.6.3.amd64\lib\site-packages\numba\cuda\cudadrv\nvvm.py in __new__(cls)
110                 try:
--> 111                     inst.driver = open_cudalib('nvvm', ccc=True)
112                 except OSError as e:

D:\WinPython-64bit-3.6.3.0Qt5\python-3.6.3.amd64\lib\site-packages\numba\cuda\cudadrv\libs.py in open_cudalib(lib, ccc)
40     if path is None:
---> 41         raise OSError('library %s not found' % lib)
42     if ccc:

OSError: library nvvm not found


顺着提示找到site-packages\numba\cuda\cudadrv\libs.py,发现其中有个test()函数。其中最重要的就2个函数,
get_cudalib get_libdevice
,定义如下:

def get_cudalib(lib, platform=None):
if lib == 'nvvm' and os.environ.get('NUMBAPRO_NVVM'):
return os.environ.get('NUMBAPRO_NVVM')
libdir = os.environ.get('NUMBAPRO_CUDALIB')
candidates = find_lib(lib, libdir, platform)
return max(candidates) if candidates else None

def get_libdevice(arch):
libdir = (os.environ.get('NUMBAPRO_LIBDEVICE') or
os.environ.get('NUMBAPRO_CUDALIB'))
pat = r'libdevice\.%s(\.\d+)*\.bc$' % arch
candidates = find_file(re.compile(pat), libdir)
return max(candidates) if candidates else None


其中一共出现了3个环境变量,即前述的3个待添加的环境变量。添加好
NUMBAPRO_CUDALIB
后,运行
get_cudalib('cublas')
有:’D:\CUDA\v9.1\bin\cublas64_91.dll’,则
NUMBAPRO_NVVM
应该也指向dll文件,即
'D:\\CUDA\\v9.1\\nvvm\\bin\\nvvm64_32_0.dll'


观察
get_libdevice
的定义和test()函数中的
archs = 'compute_20', 'compute_30', 'compute_35', 'compute_50'
可知,其需要名为
'libdevice.compute_xx.d+.bc'
的文件。

我在装好cuda9.1后发现libdevice文件夹里面并没有这些文件,于是用Listary搜索了一下,发现matlab里面就有!万能的matlab\bin里面的dll太全了!啥都有!啥都有!啥都有!

配置完成后,enjoy!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cuda python