基于Matlab的GPU加速---for循环处理

2023-05-16

采用GPU加速时,如遇for循环,则很容易增加代码在GPU上运行的时间开销。在编程时,使用矩阵和向量操作或arrayfun,bsxfun,pagefun替换循环操作来向量化代码。

1 arrayfun函数

[A, B,...] = arrayfun(fun, C, ..., Name, Value)

其中:

1) fun是函数的句柄。
2) C和其他输入是包含函数fun所需输入的数组。每个数组必须具有相同的维度,可以是数值型、字符型、逻辑型、元胞数组、结构体或用户定义的对象数组。如果是用户定义的对象数组,并且重载了subsref或size方法,那么arrayfun具有以下要求:

  • size 方法返回需要是double类型的数组。
  • 对象数组支持线性索引。
  • size方法返回的大小的乘积不能超过数组的限制,这是由数组的线性索引所定义的。

3)Name 是参数名称,Value是相应的值,其中Name是字符串,需加(’ ')。用户可按任意顺序指定多个名称和数值对。
4) A、B和其他输出是fun函数的输出数组,每个数组的大小与每个输入的大小相同。可以返回不同类的输出参数。

例如,定义以下函数:

function [D,E] = myFun(A,B,C)
    D = A.*B +C;
    E = A + B.*C +50.68;
end

将myFun函数与三个gpuArray对象一起使用,如下:

A = rand(1000,'gpuArray');
B = rand(1000,'gpuArray');
C = rand(1000,'gpuArray');
gd = gpuDevice();
tic;
[D,E] = arrayfun(@myFun, A, B ,C);
wait(gd);
toc

在这里插入图片描述

2 bsxfun函数

C = bsxfun(fun, A, B)

  1. fun函数是任何二元逐元素函数的句柄。
    2)fun函数支持标量扩展,但此时A和B的相应维度必须相等或是一维的。

例如,使用bsxfun函数将数组的每一列减去对应列中的最大值。

A = randi(10, 3, 4, 'gpuArray')
C = bsxfun(@minus, A, max(A))
max(A)

注意:
1) 矩阵的指数幂、乘法和除法(^, *, /, \)等运算过程仅支持逐元素计算,如arrayfun等函数。
2) 不支持更改输入或输出数组尺寸的操作,例如reshape函数。
3)使用rand,randirandn生成随机数组时,无须指定数组的大小。
如下列函数将会报错

function Y = myFunRand(X)
	R = rand(size(X));
	Y = R .*X;
end
A = rand(5);
B = arrayfun(@myFunRand,A)
%执行上述代码,不会报错
C = rand(5,'gpuArray');
D = arrayfun(@myFunRand,C)
% 执行该处代码,会报错

3 pagefun函数

三种格式语法:

  • A = pagefun(fun, B)
    相当于A(:,:,I,J,...) = fun(B(:,:,I,J,...)) fun 是一个带有二维输入参数的函数句柄
  • A = pagefun(fun, B, C, ...)
    相当于A(:,:,I,J,...) = fun(B(:,:,I,J,...),C(:,:,I,J,...) ,...)。输入B、C中至少有一个必须是gpuArray,其他输入参数会在调用GPU函数之前自动转换为gpuArray参数。
  • [A, B, ...] = pagefun(fun, C, ...)
    pagefun函数有多少输出就调用了多少次fun函数。A的所有元素必须是同一个类,B可以与A不同类。

例如, 利用pagefun对gpuArray的页面执行多个矩阵乘法。假设第一个数组大小是M×K,将其与具有P个页面的第二个K×N阵列执行矩阵乘法。并比较时间:

M  = 1000; % output number of rows
K = 2000; % matrix multiply inner dimension
N = 1000; % output number of coloumns
P = 200; %number of pages
A = rand(M, K, 'gpuArray');
B = rand(K, N, P,'gpuArray');
gd = gpuDevice();
tic;
% perform matrix multiplication of A and B on every page of B without 
% using pagefun
for i = 1:P
    D(:, :, i) = A * B(:,:,i);
end
wait(gd)
toc
gd = gpuDevice();
tic;
% perform matrix multiplication of A and B on every page of B with 
% using pagefun
D = pagefun(@mtimes,A, B);
wait(gd);
toc

注意:在执行代码时,将无关D变量清除。
在这里插入图片描述
页面越多,pagefun的优势越突出。

4 代码示例

代码优化示例: 使用快速卷积过滤信号
使用低通FIR滤波器对信号列执行快速卷积。该信号是振动信号,采样频率25600。Matlab代码名为fastConvolution,文件名为data.mat。

4.1 CPU运行

load data.mat;
[N M] = size(data);
t=1:N;
%采样频率
fs=25600;
%时域波形
figure
plot(t/fs,data(:,1),'k');
filter1 = [10,9,8,7,6,5,4,1,0,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10];
tic;filteredData = fastConvolution(data, filter1'); toc

在这里插入图片描述

4.2 GPU运行(不做优化)

load data.mat;
gd = gpuDevice();
tic;filteredData = fastConvolution(gpuArray(data), filter1'); 
wait(gd);
toc

在这里插入图片描述
可以看到CPU比GPU快5倍左右。

4.3 GPU运行(函数优化)

利用bsxfun对上述函数进行优化,优化函数命名为fastConvolutionVectorized, 文件名为fastConvolutionVectorized.m

function filteredData = fastConvolutionVectorized(data,filter)
% Filename: fastConvolutionVectorized.m
% Description: This function performs convolution on the columns
% of a signal(array data) using a filter
% (vector filter)(vectorized version using a bsxfun)
% Authors: Ploskas, N., & Samaras, N.
% Syntax: filteredData = fastConvolutionVectorized(data, filter)
% Input:
%   -- data: the signal (array)
%   -- filter: the filter (vector)
% Output:
%   --filteredData: the filtered signal (array)

[m,~] = size(data);   % get the size of the signal
% pad filter with zeros and calculate its DFT
filterf = fft(filter,m);
% transform each column of the signal
dataf = fft(data);
% multiply each column of the signal by the filter and 
% compute the inverse transform
filteredData = ifft(bsxfun(@times,dataf,filterf));
end

优化后CPU上运行

load data.mat;
filter1 = [10,9,8,7,6,5,4,1,0,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10];
tic;filteredData = fastConvolutionVectorized(data, filter1'); toc

在这里插入图片描述
比不改进是快了将近3倍
优化后GPU上运行

load data.mat;
gd = gpuDevice();
tic;filteredData = fastConvolutionVectorized(gpuArray(data), filter1');
wait(gd);
toc

在这里插入图片描述
比未优化前的1.4秒快了28倍。

因此,向量化代码有助于CPU和GPU版本的Matlab程序高效地运行,而向量化程序在GPU上的优化效果比在CPU上更明显。

本文相关数据链接:
链接:https://pan.baidu.com/s/1kKIsse9f4d4s4REMWzhUCw
提取码:1c7x

有帮助的话,请帮忙点赞支持,谢谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Matlab的GPU加速---for循环处理 的相关文章

  • ArcGISEngine10.0安装后因为授权问…

    ArcGISEngine10 0 安装后因为授权问题无法使用 xff0c 添加控件提示错误 例如 xff1a 创建组件 ToolbarControl 失败 错误消息为 xff1a System ComponentModel LicenseE
  • 关于transition-group报错children must be keyed: div

    学习项目时遇到了这个报错 原来的写法 lt div v for 61 34 ball in balls 34 v show 61 34 ball show 34 class 61 34 ball 34 gt lt div class 61
  • 为什么老板对项目时间安排的永远是那么的紧?

    简单分析一下 xff0c 原因基本上也就这么两点 xff0c 一方面 xff0c 可以压缩你的时间 xff0c 大家都知道时间就是公司的最大成本 xff0c 用的时间越少 xff0c 带来的价格也就越高 1年完成的项目 半年提前完成 xff
  • GCC NOT FOUNT

    错误提示 xff1a arm linux gcc Command not found 原因 xff1a 1 xff09 没有在 bashrc 或者 etc environment中添加交叉编译工具链bin文件路径 解决方法 xff1a 使用
  • 记录个人编译DCNv2的过程(windows 10,vs2019, torch1.7.0)

    小白一个 xff0c 因为配FairMOT环境需要用到DCNv2 xff0c 就简单记录一下自己遇到的问题和解决方法 如有错误 xff0c 请多指教 首先主要参考了博客https blog csdn net Ningmoua article
  • 初识CMMI2.0

    初识 CMMI2 0 xff08 以下内容根据网络知识学习和整理而成 xff09 正式发布与获取 xff1a 2018 年 3 月 8 日 xff0c CMMI2 0 正式版本正式上线全新的主页 xff08 https cmmiinstit
  • C++编写杨辉三角

    xff08 1 xff09 美观很重要 xff0c 哈哈哈 include lt iostream gt include lt iomanip gt using namespace std int YangHuiData int n n是杨
  • IP地址的分类及范围详解:A、B、C、D、E五类是如何划分的

    IP地址类型 最初设计互联网络时 xff0c 为了便于寻址以及层次化构造网络 xff0c 每个IP地址包括两个标识码 ID xff0c 即网络ID和主机ID 同一个物理网络上的所有主机都使用同一个网络ID xff0c 网络上的一个主机 包括
  • iscsiadm命令基本用法

    发现目标 iscsiadm m discovery t sendtargets p 192 168 1 1 3260 m discovery 指定模式为discovery p 192 168 1 1 3260 指定目标ip和端口 登入节点
  • linux内核中的睡眠函数*delay、*sleep

    目录 一 睡眠函数种类 1 原子上下文 2 非原子上下文 二 使用环境 1 使用环境的不同 xff0c 选择不同的延时 2 驱动机制不同 3 内核中的计算函数执行的函数 三 实测两类函数的延时以及原因 1 测试系统中的睡眠函数 2 输出结果
  • RTOS 和裸机系统的异同-基于 ESP32 学习双核 FreeRTOS 的使用

    Learning FreeRTOS with esp32 什么是 RTOS 其本质上是运行在小型嵌入式设备上的特殊软件 系统软件 如同手机的安卓系统软件 windows 系统软件 RTOS VS 裸机系统 传统的裸机系统 xff08 无操作
  • FreeRTOS 创建第一个任务

    创建第一个任务 概述 创建任务的函数为 xff1a BaseType t span class token function xTaskCreate span span class token punctuation span TaskFu
  • ACL功能的实现

    ACL 看控制访问列表 xff08 Access Control List xff09 控制指定的用户能否通过指定的接口访问本机的服务 http https ftp ssh telnet xff0c 举个例子 xff1a 没开启ACL功能前
  • STM32 USB 虚拟串口演练

    记录一下 xff0c STM32官方虚拟串口走通流程 第一步 xff0c 在CSDN寻找经验 xff0c 结合实际情况进行计划 为了节省读者时间 xff0c 推荐写的比较好的博文 地址如下 xff1a http blog csdn net
  • Linux smbclient使用详情

    例子 smbclient 192 168 10 2 目录 U 用户名 回车 再输入 密码 参数说明 网络资源 网络资源 的格式为 服务器名称 资源分享名称 密码 输入存取网络资源所需的密码 B lt IP地址 gt 传送广播数据包时所用的I
  • ESP8266获取网络天气

    使用ESP8266模块来获取网络数据 xff08 天气 xff0c 时间等 xff09 xff0c 还是挺简单的 一步一步来 1 初始化串口与相关IO 使得MCU可正常使用串口的发送与接收 xff0c 以及一些IO控制ESP8266的使能端
  • win11环境安装postgreSql数据库

    1 xff0c 下载安装文件后一路next安装 2 数据库初始化 创建data目录 xff0c 保证软件有权限读写和访问 pg ctl D data init 3 启动数据库 pg ctl D data D data start 4 创建初
  • verilog实现38译码器

    module decode 38 input wire 2 0 a output reg 7 0 y integer i always 64 begin for i 61 0 i lt 8 i 61 i 43 1 begin if a 61
  • DiffServ--百度介绍

    区分服务 xff08 DiffServ xff09 是IETF工作组为了克服Inter Serv的可扩展性差在1998年提出的另一个服务模型 xff0c 目的是制定一个可扩展性相对较强的方法来保证IP的服务质量 与综合服务 xff08 In
  • P2P在NAT和防火墙上的穿透

    概述 本文主要讨论关于P2P通信的一些常见问题和解决方案 主要内容包含 xff1a P2P通信与网络设备的关系 不同的网络设备特征对P2P产生的影响 网络地址转换 xff08 NAT xff09 的类型 NAT类型的检测方法 协议防火墙的突

随机推荐

  • conflicting types for 'dev_t'的原因

    在Linux下编译程序有时会遇到这种问题 xff0c 这貌似是一个Linux历史遗留问题 usr include sys types h 62 error conflicting types for dev t usr include li
  • https不能访问时的解决方案

    当 xff08 win7 里 xff09 IE浏览器 https打不开 https不能访问时 1 请保证 IE 工具 高级选项中的TSL 1 0前面不要打上勾就可以了 xff08 注解 xff0c 当你用 IE的 还原高级设置 时 xff0
  • Ubuntu LTS 版本知多少

    原文地址http oss org cn html 79 n 70179 html 特别声明 xff1a 从Ubuntu 12 04开始 xff0c LTS 版本的支持周期策略有所改变 xff0c 具体改变信息见下面的详细说明 先介绍一词 x
  • ubuntu下配置vlan功能--官网vlan how to

    http ubuntuforums org showthread php t 61 703387 ubuntu官网介绍 802 1q VLAN HOWTO Doing 802 1q trunking to an Ethernet switc
  • 万台规模下的SDN控制器集群部署实践

    目前在网络世界里 xff0c 云计算 虚拟化 SDN NFV这些话题都非常热 今天借这个机会我跟大家一起来一场SDN的深度之旅 xff0c 从概念一直到实践一直到一些具体的技术 本次分享分为三个主要部分 xff1a SDN amp NFV的
  • linux-vdso.so.1介绍

    这段时间看Linux内核源码的时候 xff0c 经常碰到vdso这个东西 像在Feature fixup中 xff0c 获取时间等操作时 xff0c 网上搜了一下 xff0c 才知道了含义 xff0c 原来这是Linux为了解决和glibc
  • ECC密钥编程举例,并用它做签名和验签,并生成共享密钥

    下面的例子生成两对ECC密钥 xff0c 并用它做签名和验签 xff0c 并生成共享密钥 include lt string h gt include lt stdio h gt include lt openssl ec h gt inc
  • 最新OmniPeek无线驱动详细列表与下载说明/支持捉空口包的网卡

    OmniPeek无线驱动详细列表与下载 在进行无线网络分析时 xff0c Omnipeek需要安装特殊驱动来捕获管理 控制和数据帧 而且在OmniPeek停止不用时 xff0c 它们将作为普通驱动支持网络服务的正常运行 WildPacket
  • Html自我介绍

    lt doctype html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt 兰博基尼 lt title gt lt style type 61
  • grub2下常见系统初始化错误的分析和解决

    原文连接http tieba baidu com p 2910461207 grub rescue gt grub gt initramfs 是开机错误时 xff0c 常见到的状况 我将分以下几个部份说明 xff1a 一 开机出现 grub
  • MSP-EXP430F5529LP: Error initializing emulator: No USB FET was found

    正常情况下 xff0c 安装了CCS之后 xff0c TI MSP430LaunchPad的驱动都可以自动安装好 主要是 xff1a MSP Application UART 和 MSP Debug Interface 当然 xff0c 非
  • CMakeLists.txt加载第三方库

    生成一个库文件 TgMath h ifndef TGMATH H define TGMATH H include 34 tgmath global h 34 class TGMATHSHARED EXPORT TgMath public T
  • ROS学习之订阅消息——Subscriber_代码分析

    接上篇 xff1a ROS学习之发布消息 Publisher 详解版本 xff1a 本代码文件名为 xff1a subscriber cpp include 34 ros ros h 34 include 34 std msgs Strin
  • LXC 介绍

    转自 xff1a https www cnblogs com xidongyu p 5767020 html LXC又名Linux container xff0c 是一种虚拟化的解决方案 xff0c 这种是内核级的虚拟化 主流的解决方案Xe
  • openstack原生网络和SDN网络对比

    1 原生Neutron架构图 xff1a 2 Networking odl的架构 3 ODL 处理过程 当OpenStack Neutron API接收到用户创建网络等操作请求 xff0c 它会调用ML2的相关方法 ML2已经定义了post
  • 树莓派 Raspberry Pi 3B+安装官方系统(一)

    两年前购买的树莓派 xff08 可看当时我的记录树莓派 3B 43 重装系统并配置 WiFi YouForever xff09 已经在角落里吃灰了好长时间 xff0c 一度以为已经损坏 xff0c 几天前试着拿出来折腾一下 xff0c 竟然
  • Rime——最好的输入法

    同步发布在博客 xff1a https www zhyong cn 9422 最近迷上了五笔输入法 xff0c 于是想找一款好用的五笔输入法软件 xff0c 最终确定鼎鼎大名的Rime输入法 一款跨平台的开源输入法 xff0c 支持Wind
  • Haar特征描述算子-人脸检测

    Haar特征描述算子 人脸检测 详细资料 3 1简介 Haar like特征最早是由Papageorgiou等应用于人脸表示 xff0c 在2001年 xff0c Viola和Jones两位大牛发表了经典的 Rapid Object Det
  • HTML(css+div)登录界面

    xff08 1 xff09 这是当时做的一个课程设计 xff0c 很多人想要图片 xff0c 在这里我把用到的所有图片资源分享下 xff08 2 xff09 链接 xff1a https pan baidu com s 1nUX1DQe a
  • 基于Matlab的GPU加速---for循环处理

    采用GPU加速时 xff0c 如遇for循环 xff0c 则很容易增加代码在GPU上运行的时间开销 在编程时 xff0c 使用矩阵和向量操作或arrayfun bsxfun pagefun替换循环操作来向量化代码 1 arrayfun函数