iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >怎么使用Python3+pycuda实现执行简单GPU计算任务
  • 115
分享到

怎么使用Python3+pycuda实现执行简单GPU计算任务

2023-07-05 12:07:03 115人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

今天小编给大家分享一下怎么使用python3+pycuda实现执行简单GPU计算任务的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一

今天小编给大家分享一下怎么使用python3+pycuda实现执行简单GPU计算任务的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

技术背景

GPU的加速技术在深度学习、量子计算领域都已经被广泛的应用。其适用的计算模型是小内存的密集型计算场景,如果计算的模型内存较大,则需要使用到共享内存,这会直接导致巨大的数据交互的运算量,通信开销较大。因为pycuda的出现,也使得我们可以直接在python内直接使用GPU函数,当然也可以直接在Python代码中集成一些c++的代码,用于构建GPU计算的函数。

pycuda环境配置

pycuda的安装环境很大程度上取决约显卡驱动本身是否能够安装成功,除了安装pycuda库本身之外,重点是需要确保如下的指令可以运行成功:

[dechin@dechin-manjaro pycuda]$ nvidia-smi
Sun Mar 21 20:26:43 2021       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 455.45.01    Driver Version: 455.45.01    CUDA Version: 11.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce MX250       Off  | 00000000:3C:00.0 Off |                  N/A |
| N/A   48C    P0    N/A /  N/A |      0MiB /  2002MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

上述返回的结果是一个没有GPU任务情况下的展示界面,包含有显卡型号、显卡内存等信息。如果存在执行的任务,则显示结果如下案例所示:

[dechin@dechin-manjaro pycuda]$ nvidia-smi
Sun Mar 21 20:56:04 2021       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 455.45.01    Driver Version: 455.45.01    CUDA Version: 11.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce MX250       Off  | 00000000:3C:00.0 Off |                  N/A |
| N/A   47C    P0    N/A /  N/A |     31MiB /  2002MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A     18427      C   python3                            29MiB |
+-----------------------------------------------------------------------------+

我们发现这里多了一个pid为18427的python的进程正在使用GPU进行计算。在运算过程中,如果任务未能够执行成功,有可能在内存中遗留一个进程,这需要我们自己手动去释放。最简单粗暴的方法就是:直接使用kill -9 pid来杀死残留的进程。我们可以使用pycuda自带的函数接口,也可以自己写C++代码来实现GPU计算的相关功能,当然一般情况下更加推荐使用pycuda自带的函数。以下为一部分已经实现的接口函数,比如gpuarray的函数:

怎么使用Python3+pycuda实现执行简单GPU计算任务

再比如cumath的函数:

怎么使用Python3+pycuda实现执行简单GPU计算任务

使用GPU计算向量指数

对于一个向量的指数而言,其实就是将每一个的向量元素取指数。当然,这与前面一篇关于量子门操作的博客中介绍的矩阵指数略有区别,这点要注意区分。

在下面的示例中,我们对比了numpy中实现的指数运算和pycuda中实现的指数运算。

# array_exp.py import pycuda.autoinitimport pycuda.gpuarray as gaimport pycuda.cumath as gmimport numpy as npimport sys if sys.argv[1] == '-l':    length = int(sys.argv[2]) # 从命令行获取参数值 np.random.seed(1)array = np.random.randn(length).astype(np.float32)array_gpu = ga.to_gpu(array) exp_array = np.exp(array)print (exp_array)exp_array_gpu = gm.exp(array_gpu)gpu_exp_array = exp_array_gpu.get()print (gpu_exp_array)

这里面我们计算一个随机向量的指数,向量的维度length是从命令行获取的一个参数,上述代码的执行方式和执行结果如下所示:

[dechin@dechin-manjaro pycuda]$ python3 array_exp.py -l 5
[5.0750957  0.5423974  0.58968204 0.34199178 2.3759744 ]
[5.075096   0.5423974  0.58968204 0.34199178 2.3759747 ]

我们先确保两者计算出来的结果是一致的,这里我们可以观察到,两个计算的结果只保障了7位的有效数字是相等的,这一点在大部分的场景下精度都是有保障的。接下来我们使用timeit来统计和对比两者的性能:

# array_exp.py import pycuda.autoinitimport pycuda.gpuarray as gaimport pycuda.cumath as gmimport numpy as npimport sysimport timeit if sys.argv[1] == '-l':    length = int(sys.argv[2]) np.random.seed(1)array = np.random.randn(length).astype(np.float32)array_gpu = ga.to_gpu(array) def npexp():    exp_array = np.exp(array) def gmexp():    exp_array_gpu = gm.exp(array_gpu)    # gpu_exp_array = exp_array_gpu.get() if __name__ == '__main__':    n = 1000    t1 = timeit.timeit('npexp()', setup='from __main__ import npexp', number=n)    print (t1)    t2 = timeit.timeit('gmexp()', setup='from __main__ import gmexp', number=n)    print (t2)

这里也顺便介绍一下timeit的使用方法:这个函数的输入分别是:函数名、函数的导入方式、函数的重复次数。这里需要特别说明的是,如果在函数的导入方式中,不使用__main__函数进行导入,即使是本文件下的python函数,也是无法被导入成功的。在输入的向量达到一定的规模大小时,我们发现在执行时间上相比于numpy有非常大的优势。当然还有一点需要注意的是,由于我们测试的是计算速度,原本使用了get()函数将GPU中计算的结果进行导出,但是这部分其实不应该包含在计算的时间内,因此后来又注释掉了。具体的测试数据如下所示:

[dechin@dechin-manjaro pycuda]$ python3 array_exp.py -l 10000000
26.13127974300005
3.469969915000547

以上就是“怎么使用Python3+pycuda实现执行简单GPU计算任务”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网Python频道。

--结束END--

本文标题: 怎么使用Python3+pycuda实现执行简单GPU计算任务

本文链接: https://www.lsjlt.com/news/351566.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Python3+pycuda实现执行简单GPU计算任务
    目录技术背景pycuda环境配置使用GPU计算向量指数总结概要技术背景 GPU的加速技术在深度学习、量子计算领域都已经被广泛的应用。其适用的计算模型是小内存的密集型计算场景,如果计算...
    99+
    2023-03-14
    Python pycuda计算GPU Python计算GPU Python pycuda
  • 怎么使用Python3+pycuda实现执行简单GPU计算任务
    今天小编给大家分享一下怎么使用Python3+pycuda实现执行简单GPU计算任务的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2023-07-05
  • C#怎么使用Task实现执行并行任务
    这篇“C#怎么使用Task实现执行并行任务”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#怎么使用Task实现执行并行任务...
    99+
    2023-07-05
  • unity怎么实现简单计算器
    本篇内容介绍了“unity怎么实现简单计算器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本文实例为大家分享了unity实现简单计算器的具体...
    99+
    2023-06-20
  • 怎么使用C#实现简单的计算器功能
    这篇文章主要介绍怎么使用C#实现简单的计算器功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!环境:VS2010及以上版本建立个Window窗体应用在工具箱里拖出两个TextBox,第一个放上面,第二个放下面 。主要...
    99+
    2023-06-29
  • 使用Javascript如何实现简单计算器
    小编给大家分享一下使用Javascript如何实现简单计算器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下1.htm...
    99+
    2024-04-02
  • 怎么用Java实现简单计算器功能
    这篇文章主要讲解了“怎么用Java实现简单计算器功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Java实现简单计算器功能”吧!一 项目说明实训目的:掌握 Java GUI 开发中的...
    99+
    2023-06-20
  • PyTorch中怎么使用GPU进行加速计算
    在PyTorch中使用GPU进行加速计算非常简单,只需按照以下步骤操作: 检查是否有可用的GPU 首先,检查是否有可用的GPU设...
    99+
    2024-03-05
    PyTorch
  • 使用JS实现简单计算器的方法
    今天小编给大家分享的是使用JS实现简单计算器的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。JS是什么JS是JavaScript的简称,它是一种直译式的脚本语言,其解释器被称为J...
    99+
    2023-06-14
  • Vue怎么实现简单网页计算器
    这篇文章主要介绍“Vue怎么实现简单网页计算器”,在日常操作中,相信很多人在Vue怎么实现简单网页计算器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue怎么实现简单网页计算器”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-30
  • iOS怎么实现简单计算器功能
    本篇文章给大家分享的是有关iOS怎么实现简单计算器功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。//  ZYAppDelegate.m// &...
    99+
    2023-06-29
  • 怎么用python tkinter实现简单计算器功能
    这篇文章主要讲解了“怎么用python tkinter实现简单计算器功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用python tkinter实现简单计算器功能...
    99+
    2023-06-29
  • golang同步执行任务怎么实现
    在Go中,可以通过goroutine和channels来实现任务的同步执行。具体步骤如下: 创建一个通道,用于任务之间的通信。 在...
    99+
    2023-10-22
    golang
  • php怎么实现定时执行任务
    在PHP中,可以使用以下几种方法来实现定时执行任务:1. 使用cron表达式:cron表达式是一种常用的定时任务调度语法,可以在操作...
    99+
    2023-08-12
    php
  • android定时执行任务怎么实现
    Android定时执行任务可以通过以下几种方式实现:1. 使用Handler和Timer:创建一个Handler对象,在Handle...
    99+
    2023-09-21
    android
  • C#怎么实现简单的计算器功能
    这篇“C#怎么实现简单的计算器功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#怎么实现简单的计算器功能”文章吧。1.界...
    99+
    2023-06-29
  • java swing怎么实现简单计算器界面
    这篇文章主要介绍“java swing怎么实现简单计算器界面”,在日常操作中,相信很多人在java swing怎么实现简单计算器界面问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java&...
    99+
    2023-06-30
  • 怎么用C#实现简单的计算器小程序
    这篇文章主要介绍“怎么用C#实现简单的计算器小程序”,在日常操作中,相信很多人在怎么用C#实现简单的计算器小程序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C#实现简单的计算器小程序”的疑惑有所帮助!...
    99+
    2023-06-29
  • 怎么用C++实现简单的计算器小功能
    本文小编为大家详细介绍“怎么用C++实现简单的计算器小功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用C++实现简单的计算器小功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。限制:只能使用分支语句与循...
    99+
    2023-06-29
  • 如何使用HTML和JS实现简单的计算器
    这篇文章主要介绍了如何使用HTML和JS实现简单的计算器,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。   <!doctypehtm...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作