python并行计算|pycuda测试、对比及分析
python并行计算|pycuda测试、对比及分析
增量式学习算法能够同时学习网络的节点与参数,但是随着模型结构的增长,计算成本也越来越高,有两个途径可以减少计算所需的时间成本:(1)研究模型划分方法,将比较大的模型划分成几个较小的子模型;(2)通过提高计算机的计算能力(GPU或CPU)。TX2能够利用CUDA进行GPU并行计算,pycuda作为python的并行计算库,可以方便的实现GPU并行加速。本文利用pycuda实现并行加速,并与numpy进行对比。
pycuda实现并行计算
安装、简单使用教程请参照pycuda官网。
一个简单的例子
import pycuda.autoinit
import pycuda.driver as drv
import numpy as np
import time
from pycuda.compiler import SourceModule
mod = SourceModule('''
__global__ void Text_GPU(float *A , float *B, float *K, size_t N){int bid = blockIdx.x; int tid = threadIdx.x;__shared__ float s_data[2];s_data[tid] = (A[bid*2 + tid] - B[bid*2 + tid]);__syncthreads();if(tid == 0){float sum_d = 0.0;for(int i=0;i<N;i++){sum_d += (s_data[i]*s_data[i]);}K[bid] = exp(-sum_d);}
}
''')multiply_them = mod.get_function("Text_GPU")
tic = time.time()
A = np.random.random((1000,20)).astype(np.float32)
B = np.random.random((1000,20)).astype(np.float32)
K = np.zeros((1000,), dtype=np.float32)
N = 20
N = np.int32(N)
multiply_them(drv.In(A), drv.In(B), drv.InOut(K), N,block=(20,1,1), grid=(1000,1))
toc = time.time()
print("time cost is:"+str(toc-tic))
time cost:0.00536298751831
注释
grid与block
Block之间通信通过全局内存(Global Memory),同一block下的线程之间可以相互交流通信是通过共享内存(Shared Memory)。每一个线程块都有自己对应的局部内存(Local Memory)。
SourceModule
mod = SourceModule('''
__global__ void Text_GPU(.....){
......
}
''')
这段代码是C++内核函数,里面定义的是GPU并行计算的主代码。例如:定义两个向量相加的内核函数
mod = SourceModule("""
__global__ void multiply_them(float *dest, float *a, float *b)
{const int i = threadIdx.x;dest[i] = a[i] + b[i];
}
""")
_shared_ 变量;
定义同一block下的共享内存。
__syncthreads()
同步函数,当以上代码在同一block里都运行完毕后,再执行同步函数下面的代码。
blockIdx.x与threadIdx.x
blockIdx.x取block的ID,threadIdx.x取线程的ID。
与无GPU加速的numpy计算对比
numpy方式一(非for循环)
import numpy as np
import time
A = np.random.random((1000,20)).astype(np.float32)
B = np.random.random((1000,20)).astype(np.float32)
tic = time.time()
dk = A-B
dd = [np.sum(a**2) for a in dk]
K1 = np.exp(-np.array(dd))
toc = time.time()
print("time cost is:"+str(toc-tic))
time cost is:0.0174951553345
numpy方式二(for循环)
import numpy as np
import time
A = np.random.random((1000,20)).astype(np.float32)
B = np.random.random((1000,20)).astype(np.float32)
def Guassion_kernel(x, u):d = x-udd = [np.sum(a**2) for a in d]return np.exp(-sum(dd))tic = time.time()Phi_x = []
for j in range(1000):Phi_x.append(Guassion_kernel(A[j], B[j]))
toc = time.time()
print("time cost is:"+str(toc-tic))
print(Phi_x)
time cost is:0.0264999866486
对比
表格列出以上三种方式的计算成本。可以看出GPU加速的计算时间成本最低,而带FOR循环计算的计算时间成本最高。这也只是初步的对比,实际应用中,有时GPU加速并不比CPU快。当数据维度很小,况且GPU加速的预配置也是需要额外的计算量,这导致有时带GPU加速的计算时间反而比CPU的要长。
types | GPU | CPU without for loop | CPU with for loop |
---|---|---|---|
time cost | 0.00536298751831 | 0.0174951553345 | 0.0264999866486 |
最后应用在增量式算法中,由于节点的个数是慢慢增加的。三种方式的计算每个迭代步的成本如下图所示。我们发现,运行开始时,节点个较小,GPU计算时间成本比CPU要高,但是后面的,GPU与CPU(…貌似GPU也没有很大优势,主要是节点个数还很少,一百多个节点),我相信随着节点的进一步增加,会更加突现出GPU的有效性。 | |||
结论
本文介绍了pycuda,并实现了python的GPU并行计算。
python并行计算|pycuda测试、对比及分析相关推荐
- MBTI职业性格测试和大五人格测试对比分析
mbti和大五人格的对比分析 要说出风头,那是mbti占尽了优势,但要说严肃严谨,那还得说大五.要说准确性,这个不太好对比,毕竟这是两种不同的人格测试类型,理论基础不同应用方向也不同. mbti属于人 ...
- Python数据特征分析-对比分析
Python数据特征分析-对比分析 对比分析 1.绝对数比较 → 相减 生成数据 折线图比较 柱状图比较 柱状图堆叠图比较 差值折线图比较 2.相对数比较 → 相除 结构分析 生成数据 计算额度占比 ...
- python 并行计算 并行方法总结 concurrent.futures pp pathos multiprocessing multiprocess模块 总结对比
目录 模块介绍文章 相近模块 1.按并行分类 (1)阻塞(非并行) (2)批次并行 (3)异步 2.按传参分类 (1)单个任务,任务多参数 (2)多个任务,任务单参数 (3)多个任务,任务多参数 3. ...
- php pdo 与对比mysql,php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例...
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例 本文实例讲述了php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率.分享给大家供大家参考,具体如下: ...
- 使用python及相关库实现AQI分析与预测
使用python及相关库实现AQI分析与预测 前言 一.需求背景 二.提出问题 三.数据预览 四.数据清洗 五.数据分析 六.总结 前言 一.需求背景 AQI(Air Quality Index),即 ...
- 用python进行简单的excel表格分析
今天测试要对比新旧数据,然后添加新增数据,叫我帮忙弄.我靠几千条数据怎么可能一条条筛选.就打算试试用python弄一下,对比java的poi进行的excel处理的确简单好多.很快就上手了. 1,导入包 ...
- Python做文本挖掘的情感极性分析
Python做文本挖掘的情感极性分析 数据挖掘入门与实战2017-03-23 21:25:41line阅读(27)评论(0) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本 ...
- python性能优化之函数执行时间分析_python性能优化之函数执行时间分析
最近发现项目API请求比较慢,通过抓包发现主要是response时间太长,于是就开始进行优化工作.优化工作的关键一步是定位出问题的瓶颈,对于优化速度来说,从优化函数执行时间这个维度去切入是一个不错的选 ...
- python服务器稳定性,一种基于Python服务器稳定性测试的方法技术
[技术实现步骤摘要] 本专利技术涉及一种服务器稳定性测试的方法,具体地说是. 技术介绍 随着服务器行业的快速发展,越来越多的客户开始偏向于购买大批量的服务器作为自己的核心应用.所以对服务器的稳定性也提 ...
最新文章
- 一对一直播app源码功能操详解方案分享
- java切面类整合_SpringBoot2.x【五】整合AOP切面编程
- TokuDB vs Innodb 基准测试对比
- 程序员面临的伦理困境
- java系统架构图设计,先收藏了
- DEDE 字符串操作常见问题
- [C++]2-4 子序列的和
- [转]MySQL日志——Undo | Redo
- oracle之数据处理之约束1
- 随机数归并排序c语言,用C语言实现归并排序
- windows7未能启动怎么修复计算机,win7系统提示windows无法启动这个硬件设备怎么办...
- 基于JAVA+Servlet+JSP+MYSQL的在线鲜花商城系统
- java poi设置单元格格式为数值_Excel 文本转数值的方法——我找的好苦啊
- c excel批量导入mysql数据库_Excel批量导入数据库
- 教孩子编程python 语言 nostarch 下载_教孩子学编程 Python语言版
- 1501_FTA失效树分析简介
- stm32收发 wiegand 韦根协议开发详解
- 【深入理解Java原理】Java类加载机制
- Java修改图片大小尺寸图片缩放
- 再谈js拖拽(二)仿iGoogle自定义首页模块拖拽