最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

使用Python写CUDA程序的方法详细介绍

来源:动视网 责编:小OO 时间:2020-11-27 14:24:47
文档

使用Python写CUDA程序的方法详细介绍

使用Python写CUDA程序有两种方式。* Numba;* PyCUDA;numbapro现在已经不推荐使用了,功能被拆分并分别被集成到accelerate和Numba了。例子;numba;Numba通过及时编译机制(JIT)优化Python代码,Numba可以针对本机的硬件环境进行优化,同时支持CPU和GPU的优化,并且可以和Numpy集成,使Python代码可以在GPU上运行,只需在函数上方加上相关的指令标记。如下所示。
推荐度:
导读使用Python写CUDA程序有两种方式。* Numba;* PyCUDA;numbapro现在已经不推荐使用了,功能被拆分并分别被集成到accelerate和Numba了。例子;numba;Numba通过及时编译机制(JIT)优化Python代码,Numba可以针对本机的硬件环境进行优化,同时支持CPU和GPU的优化,并且可以和Numpy集成,使Python代码可以在GPU上运行,只需在函数上方加上相关的指令标记。如下所示。


下面小编就为大家带来一篇使用Python写CUDA程序的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

使用Python写CUDA程序有两种方式:

* Numba
* PyCUDA

numbapro现在已经不推荐使用了,功能被拆分并分别被集成到accelerate和Numba了。

例子

numba

Numba通过及时编译机制(JIT)优化Python代码,Numba可以针对本机的硬件环境进行优化,同时支持CPU和GPU的优化,并且可以和Numpy集成,使Python代码可以在GPU上运行,只需在函数上方加上相关的指令标记,

如下所示:

import numpy as np 
from timeit import default_timer as timer
from numba import vectorize
@vectorize(["float32(float32, float32)"], target='cuda')
def vectorAdd(a, b):
 return a + b
def main():
 N = 320000000
 A = np.ones(N, dtype=np.float32 )
 B = np.ones(N, dtype=np.float32 )
 C = np.zeros(N, dtype=np.float32 )
 start = timer()
 C = vectorAdd(A, B)
 vectorAdd_time = timer() - start
 print("c[:5] = " + str(C[:5]))
 print("c[-5:] = " + str(C[-5:]))
 print("vectorAdd took %f seconds " % vectorAdd_time)
if name == 'main':
 main()

PyCUDA

PyCUDA的内核函数(kernel)其实就是使用C/C++编写的,通过动态编译为GPU微码,Python代码与GPU代码进行交互,如下所示:

import pycuda.autoinit
import pycuda.driver as drv
import numpy as np
from timeit import default_timer as timer
from pycuda.compiler import SourceModule
mod = SourceModule("""
global void func(float *a, float *b, size_t N)
{
 const int i = blockIdx.x * blockDim.x + threadIdx.x;
 if (i >= N)
 {
 return;
 }
 float temp_a = a[i];
 float temp_b = b[i];
 a[i] = (temp_a * 10 + 2 ) * ((temp_b + 2) * 10 - 5 ) * 5;
 // a[i] = a[i] + b[i];
}
""")
func = mod.get_function("func") 
def test(N):
 # N = 1024 * 1024 * 90 # float: 4M = 1024 * 1024
 print("N = %d" % N)
 N = np.int32(N)
 a = np.random.randn(N).astype(np.float32)
 b = np.random.randn(N).astype(np.float32) 
 # copy a to aa
 aa = np.empty_like(a)
 aa[:] = a
 # GPU run
 nTheads = 256
 nBlocks = int( ( N + nTheads - 1 ) / nTheads )
 start = timer()
 func(
 drv.InOut(a), drv.In(b), N,
 block=( nTheads, 1, 1 ), grid=( nBlocks, 1 ) )
 run_time = timer() - start 
 print("gpu run time %f seconds " % run_time) 
 # cpu run
 start = timer()
 aa = (aa * 10 + 2 ) * ((b + 2) * 10 - 5 ) * 5
 run_time = timer() - start 
 print("cpu run time %f seconds " % run_time) 
 # check result
 r = a - aa
 print( min(r), max(r) )
def main():
 for n in range(1, 10):
 N = 1024 * 1024 * (n * 10)
 print("------------%d---------------" % n)
 test(N)
if name == 'main':
 main()

对比

numba使用一些指令标记某些函数进行加速(也可以使用Python编写内核函数),这一点类似于OpenACC,而PyCUDA需要自己写kernel,在运行时进行编译,底层是基于C/C++实现的。通过测试,这两种方式的加速比基本差不多。但是,numba更像是一个黑盒,不知道内部到底做了什么,而PyCUDA就显得很直观。因此,这两种方式具有不同的应用:

* 如果只是为了加速自己的算法而不关心CUDA编程,那么直接使用numba会更好。

* 如果为了学习、研究CUDA编程或者实验某一个算法在CUDA下的可行性,那么使用PyCUDA。

* 如果写的程序将来要移植到C/C++,那么就一定要使用PyCUDA了,因为使用PyCUDA写的kernel本身就是用CUDA C/C++写的。

文档

使用Python写CUDA程序的方法详细介绍

使用Python写CUDA程序有两种方式。* Numba;* PyCUDA;numbapro现在已经不推荐使用了,功能被拆分并分别被集成到accelerate和Numba了。例子;numba;Numba通过及时编译机制(JIT)优化Python代码,Numba可以针对本机的硬件环境进行优化,同时支持CPU和GPU的优化,并且可以和Numpy集成,使Python代码可以在GPU上运行,只需在函数上方加上相关的指令标记。如下所示。
推荐度:
标签: 使用的 方式 编程
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top