我是一个初学者,试图学习如何使用GPU来执行高速计算 . 我正在尝试使用GPU实现一个简单的FFT程序 . 下面是我用于使用CPU内核计算FFT的程序 .

from time import time as timer

import numpy as np

import matplotlib.pyplot as plt

winsize=512

shift=16

my_cmap='gray_r'

Fs = 8000

f = 1000

sample =200000

x = np.arange(sample)

y = np.sin(2 * np.pi * f * x / Fs)

data_len=len(y)

window_func=np.blackman(winsize)

fftdata=np.zeros((0,int(winsize/2)))

startime=timer()

for frame in range(0, data_len, shift):

#==============================================================================

# if frame>0:

# break

#==============================================================================

kiri=y[frame:frame+winsize]

if len(kiri) != winsize:

break

windata = window_func * kiri

fftframe=np.fft.fft(windata,n=winsize)

magframe=np.abs(fftframe)**2

powerframe=np.log10(magframe):int(winsize/2)].reshape((1,int(winsize/2)))

fftdata=np.append(fftdata,powerframe,axis=0)

endtime=timer()-startime

fftdata=np.asarray(fftdata)

fftfrq=np.fft.fftfreq(winsize,d=1/Fs)[:int(winsize/2)]

print("CPU runtime:",endtime,"sec")

现在,下图是使用 imshow() 函数绘制时的输出作为频谱图:

时序输出如下:

CPU runtime: 65.02100014686584 sec

现在我重写上面的程序,使用我的PC的GPU,即使用Anaconda提供的pyculib和numba软件包的Quadro K2200 .

from time import time as timer

import numpy as np

import pyculib.fft

from numba import cuda

import matplotlib.pyplot as plt

winsize=512

shift=16

Fs = 8000

f = 1000

sample =200000

t = np.arange(sample,dtype=np.float64)

y = np.sin(2 * np.pi * f * t / Fs)

my_cmap='gray_r'

data_len=len(y)

window_func=np.blackman(winsize)

fftdata_gpu=np.zeros((0,int(winsize/2)))

startime=timer()

for frame in range(0, data_len, shift):

# =============================================================================

# if frame>0:

# break

# =============================================================================

kiri=y[frame:frame+winsize]

if len(kiri) != winsize:

break

windata = window_func * kiri

fftframe_gpu = np.zeros(winsize, np.complex128)

d_xf_gpu = cuda.to_device(fftframe_gpu)

pyculib.fft.fft(windata.astype(np.complex128),d_xf_gpu)

d_xf_gpu.copy_to_host(fftframe_gpu)

magframe_gpu=np.abs(fftframe_gpu)**2

powerframe_gpu=np.log10(magframe_gpu)[:int(winsize/2)].reshape((1,int(winsize/2)))

fftdata_gpu=np.append(fftdata_gpu,powerframe_gpu,axis=0)

endtime=timer()-startime

fftdata_gpu=np.asarray(fftdata_gpu)

print("GPU runtime:",endtime,"sec")

运行上述程序时的时序输出显示GPU实现实际上花费了30秒 .

GPU runtime: 92.87200021743774 sec

我猜测这是因为我反复将阵列复制到设备上,并为每一帧取回它 . 有没有更好的方法来实现这个?我真的很想知道我在这里做错了什么 .

下面我粘贴GPU实现的输出 .

Edit:Adding the profiling results

对于CPU代码:前20个函数调用根据累计时间排序

569255 function calls (563691 primitive calls) in 64.792 seconds

Ordered by: cumulative time

List reduced from 2594 to 20 due to restriction <20>

ncalls tottime percall cumtime percall filename:lineno(function)

296/1 0.009 0.000 64.793 64.793 {built-in method builtins.exec}

1 11.489 11.489 64.793 64.793 cuda_fft_tr1_cpu.py:6()

12469 0.037 0.000 52.145 0.004 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\numpy\lib\function_base.py:5095(append)

12469 52.093 0.004 52.093 0.004 {built-in method numpy.core.multiarray.concatenate}

12469 0.073 0.000 0.622 0.000 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\numpy\fft\fftpack.py:102(fft)

333/2 0.002 0.000 0.493 0.247 :966(_find_and_load)

333/2 0.001 0.000 0.493 0.246 :936(_find_and_load_unlocked)

323/3 0.002 0.000 0.491 0.164 :651(_load_unlocked)

272/3 0.001 0.000 0.491 0.164 :672(exec_module)

432/3 0.000 0.000 0.490 0.163 :211(_call_with_frames_removed)

12469 0.073 0.000 0.415 0.000 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\numpy\fft\fftpack.py:47(_raw_fft)

356/24 0.000 0.000 0.336 0.014 {built-in method builtins.__import__}

1 0.000 0.000 0.232 0.232 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\matplotlib\pyplot.py:17()

1445/628 0.001 0.000 0.220 0.000 :997(_handle_fromlist)

1 0.000 0.000 0.141 0.141 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\numpy\__init__.py:106()

12469 0.139 0.000 0.139 0.000 {built-in method numpy.fft.fftpack_lite.cfftf}

328 0.003 0.000 0.122 0.000 :870(_find_spec)

310 0.000 0.000 0.117 0.000 :1149(find_spec)

310 0.002 0.000 0.117 0.000 :1117(_get_spec)

1 0.000 0.000 0.115 0.115 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\matplotlib\__init__.py:101()

对于GPU代码:基于累积时间进行排序

5689881 function calls (5642977 primitive calls) in 94.179 seconds

Ordered by: cumulative time

List reduced from 4373 to 20 due to restriction <20>

ncalls tottime percall cumtime percall filename:lineno(function)

590/1 0.019 0.000 94.207 94.207 {built-in method builtins.exec}

1 12.080 12.080 94.207 94.207 cuda_fft_tr1_gpu.py:6()

12469 0.046 0.000 51.752 0.004 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\numpy\lib\function_base.py:5095(append)

12469 51.679 0.004 51.679 0.004 {built-in method numpy.core.multiarray.concatenate}

62345/49876 0.131 0.000 22.880 0.000 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\numba\cuda\cudadrv\devices.py:209(_require_cuda_context)

12469 0.111 0.000 20.875 0.002 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\pyculib\fft\api.py:190(fft)

49876 17.129 0.000 17.171 0.000 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\pyculib\utils\libutils.py:40(wrapped)

12469 0.176 0.000 15.354 0.001 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\pyculib\fft\api.py:38(__init__)

12469 0.284 0.000 15.046 0.001 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\pyculib\fft\binding.py:207(many)

37407 0.151 0.000 7.634 0.000 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\numba\cuda\cudadrv\devicearray.py:451(auto_device)

24938 0.108 0.000 4.707 0.000 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\numba\cuda\cudadrv\devicearray.py:422(from_array_like)

12469 0.043 0.000 4.644 0.000 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\pyculib\fft\api.py:134(forward)

24938 0.356 0.000 4.599 0.000 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\numba\cuda\cudadrv\devicearray.py:58(__init__)

87290 4.156 0.000 4.398 0.000 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\numba\cuda\cudadrv\driver.py:284(safe_cuda_api_call)

12469 0.035 0.000 4.292 0.000 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\numba\cuda\api.py:26(to_device)

12469 0.064 0.000 3.468 0.000 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\pyculib\fft\api.py:86(_prepare)

24938 0.027 0.000 3.404 0.000 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\numba\cuda\api.py:275(_auto_device)

24938 0.114 0.000 2.452 0.000 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\numba\cuda\cudadrv\devicearray.py:139(copy_to_device)

24938 0.080 0.000 2.157 0.000 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\numba\cuda\cudadrv\driver.py:1573(host_to_device)

24938 0.261 0.000 1.848 0.000 C:\Users\na\AppData\Local\Continuum\Anaconda3_2\lib\site-packages\numba\cuda\cudadrv\driver.py:667(memalloc)

pyculib的fft功能大约需要20秒,而numpy fft需要大约0.6秒 . 为什么pyculib的功能需要这么长时间?有没有办法改进代码以缩短这个时间?或者使用不同的库更好吗?

java 调用 pyc_pyculib fft使用gpu:加速相关推荐

  1. C语言使用CUDA中cufft函数做GPU加速FFT运算,与调用fftw函数的FFT做运算速度对比

    目录 任务介绍 环境所需相关软件下载与安装 C语言:不调用库的GPU加速FFT代码 C语言:调用fftw库的未使用GPU的FFT代码 C语言:调用cufft库的GPU加速FFT gnuplot安装画图 ...

  2. Java / Tensorflow - API 调用 pb 模型使用 GPU 推理

    目录 一.引言 二.Java / Tensorflow 代码配置 1.代码配置 2.Maven 配置 三.环境检测 1.显卡检测 2.显卡监控 四.推理踩坑 1.异常现象 2.异常日志 五.安装 cu ...

  3. fpga深度学习gpu加速_TornadoVM:使用GPU和FPGA加速Java

    fpga深度学习gpu加速 重要要点 TornadoVM是一个编程和执行框架,用于在异构硬件(多核CPU,GPU和FPGA)上卸载和运行JVM应用程序 TornadoVM通过OpenCL的新后端扩展了 ...

  4. python调用gpu运算_使用GPU加速numpy运算

    自2012年AlexNet横空出世以来,GPU用于为矩阵运算进行加速开始在工业界和研究人员中获得了广泛关注.尤其是近来推出的各种深度学习框架,如mxnet.TensorFlow等,GPU加速更是不可或 ...

  5. MATLAB上的GPU加速计算

    概述 怎样在MATLAB上做GPU计算呢?主要分为三个步骤:数据的初始化.对GPU数据进行操作.把GPU上的数据回传给CPU 一.数据的初始化 首先要进行数据的初始化.有两种方法可以进行初始化:一是先 ...

  6. 构建可扩展的GPU加速应用程序(NVIDIA HPC)

    构建可扩展的GPU加速应用程序(NVIDIA HPC) 研究人员.科学家和开发人员正在通过加速NVIDIA GPU上的高性能计算(HPC)应用来推进科学发展,NVIDIA GPU具有处理当今最具挑战性 ...

  7. 程序怎么启动vasp_构建可扩展的GPU加速应用程序(NVIDIA HPC)

    构建可扩展的GPU加速应用程序(NVIDIA HPC) 研究人员.科学家和开发人员正在通过加速NVIDIA GPU上的高性能计算(HPC)应用来推进科学发展,NVIDIA GPU具有处理当今最具挑战性 ...

  8. python gpu编程_Python笔记_第四篇_高阶编程_进程、线程、协程_5.GPU加速

    Numba:高性能计算的高生产率 在这篇文章中,笔者将向你介绍一个来自Anaconda的Python编译器Numba,它可以在CUDA-capable GPU或多核cpu上编译Python代码.Pyt ...

  9. MATLAB GPU加速

    以前使用matlab 的时候,很多人都用过里面的并行工具箱,用的最多的应该就是parfor.实际上,matlab里面已经有不少工具箱里面都有了支持GPU加速的函数.使用matlab+GPU加速的前提是 ...

最新文章

  1. 【BZOJ2326】【HNOI2011】数学作业 [矩阵乘法][DP]
  2. 【转载】SAP参数文件简介
  3. clojure source code
  4. 26-Ubuntu-文件和目录命令-其他命令-管道
  5. Flink on Yarn运行机制
  6. 使用 entrySet 遍历 Map 类集合 KV ,而不是 keySet 方式进行遍历的好处
  7. 可伸缩多线程任务队列
  8. lightoj 1382 - The Queue(树形dp)
  9. Atitit  jdbc 处理返回多个结果集
  10. 激活golang编辑器
  11. 基于Matlab的 傅里叶变换 绘制图形
  12. 求大于某数的最小素数Python版
  13. 计算机网络在信息时代中的作用
  14. WAREZ无形帝国(盗版之源) (转)
  15. 世上最伟大的十个公式,薛定谔方程排名第六,质能方程排名第五
  16. 再有人问你volatile是什么,就把这篇文章发给他,让他哑口无言
  17. 帮你早点下班~基于飞书API实现next.js网站内容自动生成实践
  18. 上交计算机考研分数线2018,2018上交考研经验贴
  19. 图像处理--医疗图片的处理
  20. 设置页面高度为浏览器可视窗口大小

热门文章

  1. 设计模式总结-结构型模式
  2. 2018年常用的7款Java框架
  3. 秒杀系统(一)——电商发展
  4. leetcode_36.有效的数独
  5. 湖南工学院 戴成秋 计算机,【计算机专业论文】教师胜任力模型计算机专业论文(共1840字)...
  6. 音乐播放(Toggle PlayerPrefs)
  7. 便签里的文件怎么传输给别人
  8. python创业公司做什么最赚钱农村_最适合农村的创业项目,成本不超过500块,做好就能快速发家致富...
  9. 会计初级系统计算机怎么样,原来初级会计题库有这么多作用 一文一探究竟!(电脑版)...
  10. WiFiSpoof for Mac(wifi地址修改工具)