一、数据的初始化
首先要进行数据的初始化。有两种方法可以进行初始化:一是先在CPU上设置好数据然后拷贝到GPU;二是直接在GPU上初始化数据。
1.1.先看看第一种方案:使用gpuArray函数。
N = 6;
M = magic(N);
G = gpuArray(M);
可见把数据从CPU拷贝到GPU上非常简单,只要B = gpuArray (A)就可以了。实际上MATLAB并没有规定一个矩阵定义之后不能改类型,所以以下也是可以的:
M = gpuArray(M);
补充说明: matlab是一种函数,用于产生魔方矩阵,它的每行、列以及对角线的数之和相等。该和的值为1+2+3+.....+n^2的和再除以n,n必须为大于或等于3的整数。例如:
有时候GPU受限于硬件架构,单精度的计算远快于双精度。这时候可以考虑在拷贝的时候顺便转换一下精度:
A = gpuArray(single(B));
1.2.第二种方法是直接在GPU上设置数据:
A = zeros(10, 'gpuArray');
也可以生成一个一维的随机数组:
r = gpuArray.rand(1, 100) % 一行,一百列
运行class函数:
class(r)
ans = gpuArray。可见这是一个在gpu上的数组。
二、
对GPU数据进行操作
下面就是对GPU数据进行操作。首先,MATLAB定义了GPU上丰富的库函数,比如快速傅立叶变换:
result = fft(r)
这样result就是另一个GPU上的数组,存储了对r做fft的结果。
三、
把GPU上的数据回传给CPU--使用gather函数
最后是如何把GPU上的数据回传给CPU:
B = gather (A);
其中A是GPU上的数据,B是CPU上的数据。B的内容在回传之后等于A。
补充:如何查看自己的电脑能否
用MATLAB进行GPU加速计算
并不是所有的电脑都可以用MATLAB进行GPU加速计算。想知道自己的电脑有没有这个能力,运行gpuDevice:
>> gpuDevice
MATLAB目前只支持Nvidia的显卡(即前面显示 CUDADevice with properties)。如果你的显卡是AMD的或者是Intel的,就得考虑另寻它路了。
参考链接:
http://blog.sina.com.cn/s/blog_6f062c360102v9ic.html
在matlab中使用GPU加速,来加速矩阵运算。
首先如前面所说,并不是所有GPU都能在maltab中进行加速的,貌似只有NVDIA的显卡可以吧。
硬件:
GeForce GTX 980
软件:
Matlab 2015a
(Matlab 2012以后的版本才带有GPU加速的工具箱)
下面开始介绍怎么玩GPU加速
第一步:
在matlab命令窗口,运行
gpuDevice
,查看自己的显卡是否具备GPU加速功能
gpuDevice
正常情况下matlab会输出如下结果代表具备GPU加速功能:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
CUDADevice with properties:
Name:
'GeForce GTX 980'
Index: 1
ComputeCapability:
'5.2'
SupportsDouble: 1
DriverVersion: 7.5000
ToolkitVersion: 6.5000
MaxThreadsPerBlock: 1024
MaxShmemPerBlock: 49152
MaxThreadBlockSize: [1024 1024 64]
MaxGridSize: [2.1475e+09 65535 65535]
SIMDWidth: 32
TotalMemory: 4.2950e+09
AvailableMemory: 3.3203e+09
MultiprocessorCount: 16
ClockRateKHz: 1380000
ComputeMode:
'Default'
GPUOverlapsTransfers: 1
KernelExecutionTimeout: 1
CanMapHostMemory: 1
DeviceSupported: 1
DeviceSelected: 1
|
第二步:
CPU和GPU之间的数据交换,大致有如下几个函数和功能:
(1)、将数据从CPU中搬入GPU,函数:
gpuArray
,用法 M = gpuArray(M);
(2)、在GPU中计算完成后,将数据搬出到CPU存储,函数:
gather
,用法M=gather(M)。
下面给大家看看最简单的用法以及处理同样矩阵运算时的时间对比:
clear all
M = rand(2000,2000); % 生成一个随机矩阵
[A1,B1] = eig(M); % 求该随机矩阵的特征值和特征向量
t1=toc
M = gpuArray(M); % 将数据从CPU中搬到GPU
[A2,B2] = eig(M); % 求特征值和特征向量
A2 = gather(A2); % 将数据从GPU中搬到CPU
t2 = toc
输出结果(运行时间对比):
1
2
|
t1 = 14.1483
t2 = 9.1567
|
总结:
虽然加速不是特别明显,不过还是非常给力的,需要说明的是,一般的
GPU对于单精度型的数据运算加速更明显一点
,因此我们在编写代码时,最好能够将数据从double型转换为single型,即M=single(M),然后在使用M=gpuArray(M),将数据搬迁到GPU进行计算,下面看看转换为单精度型后的时间对比:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
clear all
clc
M = rand(2000,2000); % 生成一个随机矩阵
tic
[A1,B1] = eig(M); % 求该随机矩阵的特征值和特征向量
t1=toc
tic
M = single(M); % 将数据转换为单精度型
M = gpuArray(M); % 将数据从CPU中搬到GPU
[A2,B2] = eig(M); % 求特征值和特征向量
A2 = gather(A2); % 将数据从GPU中搬到CPU
t2 = toc
|
运行结果:
1
2
|
t1 = 14.8332
t2 = 5.0963
|
GPU对eig和svd进行加速,和cpu运行时间对比
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
clear all
A = rand(2000,2000);
tic
A1 = gpuArray(single(A));
[U,S,V] = svd(A1,
'econ'
);
A2 = U*S*V';
A3 = gather(A2);
t = toc
tic
[U1,S1,V1] = svd(A,
'econ'
);
A4 = U1*S1*V1';
t2 = toc
error = norm(A3-A4,
'fro'
)
tic
A1 = gpuArray(single(A));
[vv,dd] = eig(A1);
t3 = toc
|
1
2
3
4
5
|
t = 3.1564
t2 = 7.1644
error = 0.0032
t3 = 5.2244
t4 = 17.6389
|
是不是加速更明显了呢?
注:1、单精度型初始化矩阵函数例:X=rand(10,'single'); %定义在CPU上的一个10x10的随机初始化数组
2、直接在GPU中初始化矩阵例:GX=rand(10,'gpuArray'); %直接在GPU设备上随机初始化一个10x10的数组
3、判断数据DATA是否存在于GPU内存中例:TF=existOnGPU(DATA)
4、计算效率统计例:t=gputimeit(F,N) %返回执行F操作N次所需的时间,当N=1时可以缺省
使用CUDA加速MATLAB程序
2018-01-25 17:38:19
qq_32464407
阅读数 6570
收藏
版权声明:本文为博主原创文章,遵循
CC 4.0 BY-SA
版权协议,转载请附上原文出处链接和本声明。
本文链接:
https://blog.csdn.net/qq_32464407/article/details/79164305
MATLAB十分擅长矩阵计算,如能借助CUDA工具箱调用NVIDIA GPU加速并行运算,能起到如虎添翼的效果。
最简单的调用方法是使用gpuArray()函数数据放到GPU上运算,再用gather()函数将结果取回(前提是运算支持gpuArray类型的变量,目前尝试过的矩阵乘法、求逆、pdist、pdist2函数均支持,可惜进行二次规划的quadprog并不支持。)。
不过,我最初在windows版MATLAB下调用gather()函数经常报错,然后便无法再MATLAB中调用GPU,使用reset(gpuDevice(1)))也还是报错。百度一番之后发现原来是windows系统的显卡超时检测和恢复(TDR)功能惹的祸。关闭TDR的方法是在HKLM\System\CurrentControlSet\Control\GraphicsDrivers下创建Dword值TdrLevel,并赋值为0 (https://answers.microsoft.com/zh-hans/windows/forum/windows_7-hardware/win7%E4%B8%AD%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AE/69384e71-5075-4afe-a437-372425c0a3bb?auth=1)
用常用的pdist2函数进行测试:
gpuDevice(1)
A=rand(10000,10000);
B=rand(8000,10000);
tic; C = (pdist2((A),(B))); toc
tic; D = gather(pdist2(gpuArray(A),gpuArray(B))); toc;
ans =
CUDADevice - 属性:
Name: 'GeForce GTX 1050'
Index: 1
ComputeCapability: '6.1'
SupportsDouble: 1
DriverVersion: 9.1000
ToolkitVersion: 8
MaxThreadsPerBlock: 1024
MaxShmemPerBlock: 49152
MaxThreadBlockSize: [1024 1024 64]
MaxGridSize: [2.1475e+09 65535 65535]
SIMDWidth: 32
TotalMemory: 4.2950e+09
AvailableMemory: 3.4824e+09
MultiprocessorCount: 5
ClockRateKHz: 1493000
ComputeMode: 'Default'
GPUOverlapsTransfers: 1
KernelExecutionTimeout: 0
CanMapHostMemory: 1
DeviceSupported: 1
DeviceSelected: 1
时间已过 161.138259 秒。
时间已过 41.843864 秒。
可见GPU执行pdist2这种高度并行化的运算效率高出不少。
Matlab 并行计算学习初步
2018-08-09 08:19:57
如若明镜
阅读数 18430 收藏 更多
分类专栏:
programming
版权声明:本文为博主原创文章,遵循
CC 4.0 BY-SA
版权协议,转载请附上原文出处链接和本声明。
本文链接:
https://blog.csdn.net/u011335616/article/details/41929033
Matlab 并行计算学习
高性能计算(High Performance Computing,HPC)是计算机科学的一个分支,研究并行算法和开发相关软件,致力于开发高性能计算机。可见并行计算是高性能计算的不可或缺的重要组成部分。
并行计算(Parallel Computing)是指同时使用多种计算资源解决计算问题的过程,是提高计算机系统计算速度和处理能力的一种有效手段。它的基本思想是用多个处理器来协同求解同一问题,即将被求解的问题分解成若干个部分,各部分均由一个独立的处理机来并行计算。并行计算系统既可以是专门设计的、含有多个处理器的超级计算机,也可以是以某种方式互连的若干台的独立计算机构成的集群。通过并行计算集群完成数据的处理,再将处理的结果返回给用户
[1]
。
平台是并行计算的载体,它决定着你可以用或只能用什么样的技术来实现并行计算。
多核和集群技术的发展,使得并行程序的设计成为提高数值计算效率的主流技术之一。常用的小型计算平台大致分为:由多核和多处理器构建的单计算机平台;由多个计算机组成的集群(Cluster)。前者通过共享内存进行数据交互,后者通过网络进行数据通信。
计算正在从 CPU(中央处理)向 CPU 与 GPU(协同处理)的方向发展。
GPU最早主要应用在图形计算机领域,近年来,它在通用计算机领域得到了迅猛的发展,使用GPU做并行计算已经变得越来越重要和高效。
常用的并行计算技术包括多线程技术、基于共享内存的OpenMP技术,基于集群的MPI技术等。但它们都需要用户处理大量与并行计算算法无关的技术细节,且不提供高效的算法库,与数值计算的关联较为松散。
Matlab即是一款数值计算软件,又是一门语言,它已经成为数值计算领域的主流工具。Matlab提供了大量高效的数值计算模块和丰富的数据显示模式,便于用户进行快速算法的研究和科学建模仿真。自Matlab 2009 之后,Matlab推出了并行计算工具箱(Parallel ComputingToolbox,PCT)和并行计算服务(Distributed ComputingServer,DCS),通过PCT和DCS用户可以实现基于多核平台、多处理器平台和集群平台的多种并行计算任务。利用PCT和DCS,用户无需关心多核、多处理器以及集群之间的底层数据通信,而是将主要精力集中于并行算法的设计。此外,PCT还增加了对GPU(Graphics ProcessingUnit)的支持。
Matlab 并行计算工具箱,使用多核处理器,GPU和计算机集群,解决计算和数据密集型问题。高层次的结构并行for循环,特殊阵列类型和并行数值算法,让你在没有而CUDA或MPI编程基础的条件下并行MATLAB应用程序。您可以使用带有Simulink的工具箱并行运行一个模型的多个仿真。
该工具箱,通过在本地workers(MATLAB计算引擎)上执行应用程序,来使用多核台式机的全部处理能力。不用改变代码,就可以在计算机集群或网格计算服务(使用MATLAB分布式计算服务器™)上运行相同的应用程序。可以交互地或批处理地运行并行应用程序。
包含以下特性:
-
并行for循环 (parfor),可以在多个处理器上运行任务并行算法。
-
支持CUDA的NVIDIA GPU。
-
通过本地workers,充分利用台式机的多核处理器。
-
计算机集群和网格计算支持(通过MATLAB分布式计算服务)。
-
以交互方式和批量方式执行并行应用程序。
-
分布式阵列和SPMD(single-program-multiple-data),用于大型数据集的处理和数据并行算法。
本文仅介绍循环的并行,批处理和GPU并行计算。
在使用parfor和spmd之前,首先要配置和开启并行计算池。parpool函数[1]提供并行池的配置和开启功能,其用法如下表 2‑1:
表 2‑1 parpool函数用法
此外,还可以给上述命令指定输出参数,如输入:
p = parpool
,输出如下图:
图2‑1 输入命令p=parpool时的运行结果
输出参数p为并行池对象,一个池对象有7中属性,上图显示了6种属性。其中,“NumWorkers” 代表worker的个数,也就是说开启了两个并行池;“IdleTimeout”指定了池定时关闭的时长,单位为分钟,图中为30分钟;“SpmdEnabled”指定池是否可以运行SPMD代码,其它属性相见Matlab 并行工具箱手册[2]。
此外,可以通过
p.Property
访问和设置属性,如
p.IdleTimeout = 10;
可以设置定时关闭池的时长为10分钟。
如果在启动池时没有设置输出参数
p
,可以使用
gcp
函数获取当前池的对象,gcp的用法如下表2-2:
表 2‑2 gcp用法
语法和参数
|
功能
|
p = gcp
|
获取当前池对象,如果未开启,则使用默认配置文件创建池。
|
p = gcp('nocreate')
|
获取当前池对象,如果未开启,返回空。
|
Matlab中,使用delete函数关闭或删除池,用法:
delete(poolobj)
,其中
poolobj
为要关闭的池对象。
图 2‑2 Matlab client 分配parfor并行任务到多个Matlab
|
Matlab并行执行parfor循环时,采用client和worker模式。其中client指编写和启动并行代码的Matlab段,worker指并行运行代码的Matlab端。用户可以将Matlab软件理解为一个进程,在同一计算机或网络上的多个计算机上可以运行多个Matlab进程,每个Matlab进程之间通过某种方式进行数据传输,用户首先在client端编写代码,然后再client端运行编写的代码,在运行代码的过程中,如果某个程序需要并行执行,Matlabclient端根据并行代码的关键字及类型将并行代码分配到本机或网络上的其它Matlab进程执行,那些最终执行并行代码的Matlab进程即为worker[3]。右图显示了,Matlab client 对parfor关键字的处理,它将任务分配到多个Matlab workers 上并行执行程序。假设m为Matlab worker的数量,循环次数为n,若n/m为整数的话,则循环将被均匀划分到Matlab worker;否则,循环被非均匀划分,有些Matlab worker的负载会大些。
应用parfor的一个基本前提是循环可以被等效分解,即分解后的循环的执行顺序不会影响最终结果。parfor的用法与for类似,其语法如下表 2‑3:
表2‑3 parfor的用法
语法和参数
|
功能
|
parfor loopvar = initval:endval,statements,end
|
在并行池中执行循环。其中
initval
和
endval
必须为正整数,或者是一个包含连续递增的整数行矢量。
parfor i = range; <loop body>; end
,这样单行书写也是可以的,其中的“;”可以是“,”。
|
parfor (loopvar = initval:endval, M), statements, end
|
使用
M
指定执行循环体的Matlab worker的最大数量,
M
为非负整数,如果
M
=0,则在client上串行执行。
|
并行计算间的数据转移大小极限受Java虚拟机(JVM)内存分配的限制。在MJS集群上执行job的client和worker间的单次数据转移量也受此限制。具体大小限制取决于系统结构。如下表所示:
表 2‑4 每次转移数据的最大量与系统结构的关系
系统结构(System Architecture)
|
每次转移数据的最大数(近似值.)
|
64-bit
|
2.0 GB
|
32-bit
|
600 MB
|
使用parfor并行for循环的基本步骤为:
1) 使用parpool函数配置和开启并行计算池。
2) 将串行循环中的for关键字改为parfor,并注意是否要修改循环体,以满足特定要求,如循环变量的类型要求(参见参考手册)
3) 执行完毕后若不再进行并行计算,使用delete关闭并行池。
batch函数完成函数或脚本在集群或台式机上的分载执行,也就是实现函数或脚本的并行。这里不再说明语法(详见Matlab 并行工具箱参考手册),而是举两个例子说明它的使用方法(此例子亦来自参考手册)。
创建mywave.m脚本文件,输入如下代码并保存:
for i=1:1024
A(i) = sin(i*2*pi/1024);
end
|
在命令行窗口输入:
job = batch('mywave')
,Matlab以下图所示方式并行运行:
图 2‑3 批处理for循环
然后等待作业完成:
wait(job),
使用load命令将数据从Matlabworker 转移到Matlabclient的workspace,即
load(job,’A’)
。任务完成后,使用
delete(job)
永久删除它的数据。
打开mywave.m脚本文件,修改for为parfor,保存,代码如下:
parfor i=1:1024
A(i) = sin(i*2*pi/1024);
end
|
输入:
job =batch('mywave','Pool',2)
,以两个worker来执行parfor并行循环任务,所以此例总共使用3个本地worker,如下图所示:
图2‑4 批处理并行循环
同样的,依次使用
wait(job)
、
load(job,'A')
,将数据从worker的workspace转移到client的workspace。最后,使用
delet(job)
删除数据。
批处理命令还有其它的运行方式,在此不再介绍。
Matlab 的GPU计算实现MATLABworkspace和图形处理器(GPU)间的数据传递;在GPU上执行代码。
用户可以使用计算机的GPU处理矩阵运算,在大多数情况下,在GPU上执行要比在CPU上快。
Matlab的GPU计算提供了下表 2‑5所列的14种MATLAB函数和1种C语言函数,表中仅简要介绍函数功能,具体参见Matlab并行工具箱参考手册。
表2‑5 GPU计算函数列表
函数
|
功能
|
gpuArray
|
在GPU上创建阵列。
|
gather
|
把分布式阵列或gpuArray转移到Matlab的workspace。
|
existsOnGPU
|
确定gpuArray或CUDAKernel在GPU上可用。
|
gpuDevice
|
查询或选择GPU设备。
|
gpuDeviceCount
|
目前GPU的设备数量。
|
gputimeit
|
在GPU上运行函数所需时间。
|
reset
|
重置GPU设备并清空它的内存。
|
wait(GPUDevice)
|
等待GPU计算完成。
|
arrayfun
|
对GPU阵列上的每个元素应用函数。
|
bsxfun
|
用于GPU阵列的二元但扩展函数。
|
pagefun
|
对GPU阵列的每一页应用函数。
|
parallel.gpu.CUDAKernel
|
从PTX和CU代码创建 GPU CUDA kernel 对象。
|
feval
|
评估GPU的核。
|
setConstantMemory
|
设置GPU的一些常量内存。
|
mxInitGPU
|
这是一个C语言函数,在当前选择的设备上初始化Matlab GPU计算库。
|
Matlab的GPU计算提供了三种Matlab类和一种C类,如下表 2‑6
表2‑6 Matlab GPU计算提供的类
类
|
描述
|
gpuArray
|
存储在GPU上的阵列
|
GPUDevice
|
图形处理单元Graphics processing unit (GPU)
|
CUDAKernel
|
执行在GPU上的核
|
mxGPUArray
|
它是一个C类,MEX函数可以访问Matlab的gpuArray
|
关于各类的具体含义和各函数的详细用法请参见MATLAB并行工具箱手册。
下面主要从:GPU设备查询、在GPU上创建数组、在GPU上运行内置函数、在GPU上运行自定义函数四个方面说明Matlab GPU计算支持的技术,此外,用户还可以在GPU上运行CUDA或PTX代码、运行包含CUDA代码的MEX-函数等等,详见MATLAB并行工具箱手册和文献[3]的第10章。
GPU设备查询与选择
在使用GPU设备之前,可以利用
gpuDeviceCount
函数查看计算机当前可用GPU设备数量,若存在可用的GPU设备,则输出大于等于1的数。
在Matlab中使用
gpuDevice(IDX)
来选择第IDX个GPU设备,起始编号为1,如输入gpuDevice(1),输出右图所示结果:
其中,“MaxThreadsPerBlock”表示每个Block的最大线程数;“MaxShmemPerBlock”表示每个Block可用的最大共享内存大小;“TotalMemory”表示GPU拥有的所有内存,图中为2.1475e+09Byte,即2GB;“FreeMemory”代表可用内存;“MultiprocessorCount”表示GPU设备处理器个数;“DeviceSupported”表示本机Matlab支持的GPU设备数。
有两种方式在GPU上创建阵列:从Workspace转移和直接创建。
1) 从Workspace转移到GPU
使用
gpuArray
函数来把数据从Workspace转移到GPU,如下面的代码所示,将Workspace中的阵列A转移到GPU中,并存为G,原Workspace中的A阵列并不消失。
A = [1 2 3;4 5 6];
G = gpuArray(A);
|
该函数支持对非稀疏阵列且可以是:'single','double','int8','int16','int32','int64','uint8','uint16','uint32','uint64',or 'logical'类型。
2) 直接创建GPU
阵列
gpuArray类提供了一些方法来在GPU上直接创建阵列,这样就不需要从Workspace进行转移。可用的有:
表 2‑7 gpuArray类提供的创建GPU阵列的方法
方法
|
方法
|
eye
(___,'gpuArray')
|
rand
(___,'gpuArray')
|
false
(___,'gpuArray')
|
randi
(___,'gpuArray')
|
Inf
(___,'gpuArray')
|
randn
(___,'gpuArray')
|
NaN
(___,'gpuArray')
|
ones
(___,'gpuArray')
|
gpuArray.
linspace
|
true
(___,'gpuArray')
|
gpuArray.
logspace
|
zeros
(___,'gpuArray')
|
gpuArray.
colon
|
如:
G = ones(100,100,50,'gpuArray');
在GPU上创建一个100-by-100-by-50的阵列。
此外,支持gpuArray阵列的方法还有abs,cos,fft,conv,plot等等共
369
个方法。若要查看,输入如下命令即可查看:
如果,要查看某个方法的帮助,输入如下命令查看:
help gpuArray/functionname
|
其中,functionname为函数名,如:
helpgpuArray/dot
。
3) 从GPU上回收数据
从GPU上回收数据,即把数据从GPU转移到MatlabWorkspace。在Matlab中使用
gather
函数来取回GPU上的数据并存在Matlab的 Workspace中。可以使用
isequal
函数来验证转移前后,值是否相同。如下代码将GPU中的阵列G传回到Workspace生成D。
G = gpuArray(ones(100,'uint32'));
D = gather(G);
OK = isequal(D,G)
|
如 2)
直接创建GPU阵列
所述,Matlab的369个函数都支持对GPU阵列的操作,下面是手册上的一个示例代码:
Ga = rand(1000,'single','gpuArray');
Gfft = fft(Ga);
Gb = (real(Gfft) + Ga) * 6;
G = gather(Gb);
|
代码主要实现对GPU上的阵列Ga进行FFT变换,并将结果回收到Workspace。可见内置函数的调用与普通串行程序没有大的区别,只是输入阵列的类型为gpuArray。
Matlab中使用
arrayfun
或
bsxfun
来执行自定义的函数,即:
result = arrayfun(@myFunction,arg1,arg2);
|
下面举例来说明,创建myfun.m文件,打开输入如下代码:
function [ absga1,absga2,maxga ] = myfun( ga1,ga2 )
absga1 = abs(ga1);
absga2 = abs(ga2);
maxga = max(absga1,absga2);
|
该代码实现对输入阵列ga1,ga2的每个元素取绝对值,然后取出两者中对应最大的。为了运行并查看结果,创建一个脚本,输入如下代码:
ga1 = [-1 5 -3]
ga2 = gpuArray([4 -6 -2])
[absga1,absga2,maxga] = arrayfun(@myfun,ga1,ga2)
absda1 = gather(absga1)
absda2 = gather(absga2)
maxda = gather(maxga)
|
通过上述程序,可以看出,在自定义函数myfun中,只要有一个输入参数的类型为gpuArray,则整个函数myfun都将运行在GPU中,对于非gpuArray类型的阵列,Matlab自动进行转换。
除了可以调用Matlab自身支持的函数外,可以自己编写支持GPU的Matlab函数。自定义的函数中可以调用的函数和操作如下表 2 8:
表2‑8 自定义函数中支持gpuArray的函数和操作
abs
and
acos
acosh
acot
acoth
acsc
acsch
asec
asech
asin
asinh
atan
atan2
atanh
beta
betaln
bitand
bitcmp
bitget
bitor
bitset
bitshift
bitxor
ceil
complex
conj
cos
cosh
cot
coth
csc
csch
|
double
eps
eq
erf
erfc
erfcinv
erfcx
erfinv
exp
expm1
false
fix
floor
gamma
gammaln
ge
gt
hypot
imag
Inf
int8
int16
int32
int64
intmax
intmin
isfinite
isinf
isnan
ldivide
le
log
log2
|
log10
log1p
logical
lt
max
min
minus
mod
NaN
ne
not
or
pi
plus
pow2
power
rand
randi
randn
rdivide
real
reallog
realmax
realmin
realpow
realsqrt
rem
round
sec
sech
sign
sin
single
|
sinh
sqrt
tan
tanh
times
true
uint8
uint16
uint32
uint64
xor
+
-
.*
./
.\
.^
==
~=
<
<=
>
>=
&
|
~
&&
||
|
以下的标量扩展版:
*
/
\
^
分支指令:
break
continue
else
elseif
for
if
return
while
|
本文简要介绍了Matlab并行工具箱及其用法,包括多处理器的并行和GPU的并行,具体包括:并行计算池的开启,查询与关闭;for循环的并行;批处理;GPU计算。由于时间关系并未介绍分布式阵列和SPMD。
尝试并行化自己改进的Hough变换算法和FCM,可是并行后的效果很差(这和使用的电脑的配置有关),本文中并未给出,将来会进一步研究。
之所以选择高性能计算这门课,是因为在研究学习中,发现程序的运行速度是一个很重要和亟待解决的问题。已经尽量采用矢量化编程实现,可是它的本质是牺牲空间换时间,仍不能满足需求。高性能计算让我找到了突破点,将来会继续开展相关的工作。
[1]
http://baike.baidu.com/view/1666.htm?fr=aladdin
[2] 并行工具箱在线手册:
http://cn.mathworks.com/help/distcomp/index.html
[3] 实战 Matlab之并行程序设计[J]. 2012.
概述怎样在MATLAB上做GPU计算呢?主要分为三个步骤:数据的初始化、对GPU数据进行操作、把GPU上的数据回传给CPU一、数据的初始化首先要进行数据的初始化。有两种方法可以进行初始化:一是先在CPU上设置好数据然后拷贝到GPU;二是直接在GPU上初始化数据。1.1.先看看第一种方案:使用gpuArray函数。N = 6;M = magic(N);G = gpu...
一、并行
计算
MATLAB
提供了并行
计算
的功能,可以充分利用多核处理器和分布式
计算
资源,显著提高代码执行效率。在
MATLAB
中进行并行
计算
的主要工具有Parallel Computing Toolbox和parfor循环。
Parallel Computing Toolbox
Parallel Computing Toolbox是
MATLAB
提供的一套用于并行
计算
的工具
一般代码
加速
方法
Matlab
目前只支持Nvidia的显卡。
GPU
设备确认想知道自己的电脑有没有这个能力,在
Matlab
中运行
gpu
Device。
只要数据格式是
gpu
Array格式的,那么
计算
过程会自动的调用
GPU
进行
计算
。
GPU
和CPU之间数据传递
gpu
Array
I) 将CPU内存数据传到
GPU
内存中
X=rand(10,'single'); %定义在CPU上的一个10x10的随机初始化
在
matlab
中使用
GPU
加速
,来
加速
矩阵运算。
首先如前面所说,并不是所有
GPU
都能在maltab中进行
加速
的,貌似只有NVDIA的显卡可以吧。
硬件:GeForce GTX 980
软件:
Matlab
2015a (
Matlab
2012以后的版本才带有
GPU
加速
的工具箱)
下面开始介绍怎么玩
GPU
加速
第一步:在
matlab
命令窗口,运行
gpu
Device,查看自己的显...
在
GPU
编程中,函数一般分为以下几种类型:数学函数、几何函数、纹理映射函数、偏导数函数、调试函数等。熟练利用好
GPU
自带函数,可以在一定程度上提高并行编程速度与效率。
数学函数(Mathematical Functions)
数学函数用于执行数学上常用
计算
,比如:三角函数、幂函数。向量和矩阵函数,这些函数一般都被重载,用来支持标量数据和不同长度的向量作为输入参数。列表如下:
根据引用所提到的信息,"
matlab
_
gpu
加速
"是指在使用
Matlab
程序时,通过利用
GPU
(图形处理器)来提高
计算
速度和效率。使用
GPU
可以利用其并行处理能力来
加速
计算
任务,特别是对于需要处理大量数据或进行复杂
计算
的任务。这一
加速
技术可以显著减少
计算
时间,提高程序的性能。
要启用
Matlab
的
GPU
加速
,首先需要确保
计算
机中安装了支持
GPU
计算
的硬件(如NVIDIA的CUDA-enabled
GPU
)以及相应的驱动程序。然后,在
Matlab
中,可以使用
GPU
Computing Toolbox来利用
GPU
进行
计算
加速
。该工具箱提供了一系列函数和工具,使用户可以将
计算
任务分配给
GPU
并利用其并行
计算
能力。
使用
Matlab
进行
GPU
加速
的一般步骤如下:
1. 确保
计算
机中的
GPU
和相关驱动程序已正确安装。
2. 在
Matlab
中启用
GPU
计算
功能,可以使用以下命令:
gpu
Device()
这将显示
计算
机上可用的
GPU
设备,并为后续的
GPU
计算
做好准备。
3. 使用
GPU
Computing Toolbox提供的函数和工具,将需要进行
加速
的
计算
任务分配给
GPU
。一些常用的
GPU
计算
函数包括`
gpu
Array`(将数据移动到
GPU
上)、`
gpu
Arrayfun`(在
GPU
上执行函数)和`gather`(将数据从
GPU
移回主机内存)等。
通过合理地使用
GPU
加速
技术,可以提高
Matlab
程序的执行效率,特别是对于那些需要处理大规模数据或进行复杂
计算
的任务。