我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用Python写CUDA程序

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用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++写的。

参考文献

Numba. http://numba.pydata.org/
PyCUDA. https://mathema.tician.de/software/pycuda/

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用Python写CUDA程序

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用Python写CUDA程序

使用Python写CUDA程序有两种方式: * Numba * PyCUDAnumbapro现在已经不推荐使用了,功能被拆分并分别被集成到accelerate和Numba了。例子numbaNumba通过及时编译机制(JIT)优化Pytho
2023-01-31

使用Python写CUDA程序的方法

使用Python写CUDA程序有两种方式: * Numba * PyCUDA numbapro现在已经不推荐使用了,功能被拆分并分别被集成到accelerate和Numba了。 例子 numbaNumba通过及时编译机制(JIT)优化P
2022-06-04

使用VScode编写python程序并打

据说Visual Studio Code(VS Code)的诸多好处,了解了一下果然很喜欢,我喜欢它的原因主要有3个,一是VS Code开源且跨平台,二是因为其界面非常酷,三是可以满足我的大所属代码需求,除此之外当然还有强大的好奇心。  使
2023-01-30

如何使用Python编写诗词接龙程序

这篇文章主要介绍了如何使用Python编写诗词接龙程序的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用Python编写诗词接龙程序文章都会有所收获,下面我们一起来看看吧。诗歌语料库  首先,我们利用Pyt
2023-07-06

zeppelin下写python程序

%pysparknum1=100num2=150print num1+num2
2023-01-31

如何编写 Python 程序

如何编写 Python 程序从今以后,保存和运行 Python 程序的标准步骤如下:对于 PyCharm 用户打开 PyCharm。以给定的文件名创建新文件。输入案例中给出的代码。右键并运行当前文件。注意:每当你需要提供 命令行参数(Com
2023-01-31

怎么用python编写窗口程序

要使用Python编写窗口程序,您可以使用第三方图形界面库,如Tkinter、PyQt或wxPython。下面是一个使用Tkinter库编写简单窗口程序的示例:```pythonimport tkinter as tk# 创建一个窗口win
2023-09-28

怎么编写Python程序

本篇内容介绍了“怎么编写Python程序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!编写代码的工具交互式环境我们打开Windows的“命令
2023-06-01

sublime如何写python程序

小编给大家分享一下sublime如何写python程序,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!sublime写python程序的方法:首先安装python程序,打开后选择python语言;然后输入代码,并保存为【xx
2023-06-06

Python写的ATM小程序

很久没写博客了,近两年的时间一直在搞Openstack相关的东西,有时间我也会把我认为值得写得一些技术和经验分享出来。以后准备好好学学Python了,要不快没饭吃了,这两个礼拜看了一些视频教程和书籍,遂拿这个ATM小程序练练手。文件结构:程
2023-01-31

使用python怎么编写一个扎金花小程序

本篇文章为大家展示了使用python怎么编写一个扎金花小程序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。程序需要实现的点:先生成一付完整的扑克牌给5个玩家随机发牌统一开牌,比大小,输出赢家是谁主要
2023-06-06

VS2017使用教程(使用VS2017编写C语言程序)

以下是使用VS2017编写C语言程序的简单教程:步骤1:安装VS2017首先,你需要从官方网站下载并安装Visual Studio 2017。你可以选择适合你的操作系统的版本(例如Windows 10)并按照安装向导的指示完成安装。步骤2:
2023-09-13

如何使用scala编写wordcount程序

本篇内容介绍了“如何使用scala编写wordcount程序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!直接上程序吧一、公共类
2023-06-03

Python使用SocketServer模块编写基本服务器程序的教程

SocketServer简化了网络服务器的编写。它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer。这4个类是同步进行处理的,另外通过ForkingMixIn和Thre
2022-06-04

使用Python编写简单的画图板程序的示例教程

从这次开始,我会由简单到困难(其实也不会困难到哪里去)讲几个例程,每一个例程都是我自己写(或者修改,那样的话我会提供原始出处)的,都具有一定的操作性和娱乐性。例程中汇尽量覆盖到以前所讲的pygame中方方面面,如果看到哪一步不明白,那就再回
2022-06-04

怎样用python写一个hello world程序

怎样用python写一个hello world程序,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。(1) 建一个hello.py[hadoop@slave1 桌面]$ vi
2023-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录