Matlab本就擅长矩阵计算,其借助CUDA工具箱调用Nvidia GPU加速并行运算,可以起到如虎添翼的效果。今天给大家介绍一下CUDA的基础知识以及如何快速在Matlab中调用工具箱对程序进行加速。
CUDA,Compute Unified Device Architecture 统一计算设备架构
CUDA编程模型是将CPU作为主机,GPU作为协处理器或者叫设备,一般情况下,CPU负责进行逻辑性强的事务处理和串行计算,GPU则专注于执行高度线程化的并行处理任务。各自拥有相互独立的存储地址空间,也就是主机端的内存和设备端的显存。
操作显存需要调用CUDA API中的存储器管理函数,操作包括开辟、释放、初始化显存空间等,在主机端和设备端之间进行数据传输等。运行在GPU上的CUDA并行计算函数称为Kernel(内核函数),一个kernel函数并不是一个完整的程序,而是整个程序中的一个可以被并行执行的步骤,一个完整的CUDA程序是有一系列的设备端Kernel函数并行步骤和主机端的串行处理步骤共同完成。
Matlab目前仅支持Nvidia显卡,想知道自己的电脑有没有这个能力,在Matlab中运行 gpuDevice即可,这是在笔记本的Matlab2018b中运行的结果。可以看出显卡是“GeForce MX150”,其计算能力为6.1。计算能力的小数点前的第一位表示设备核心架构,小数点后的一位表示更加细微的进步,包括对核心架构的改进和功能的完善。
除了反映计算架构版本的计算能力,还有这些涉及到资源总量的参数也实实在在影响到GPU的计算性能。Kernel以线程网格(Grid)的形式组织,每个Grid由若干个线程块(block)组成,每个block由若干个线程(thread)组成。
Kernel以block为单位执行,Grid只是用来表示一系列可以被并行执行的block集合,而block间无法通信,没有执行顺序。本机中相关资源的数量介绍:
MaxThreadsPerBlock: 1024,每个block最大的线程数;
MaxShmemPerBlock: 49152,每个block可用的最大共享内存大小;
MaxThreadBlockSize: [1024 1024 64],三个维度各自最大的线程数量;
MaxGridSize: [2.1475e+09 65535 65535],三个维度各自最大的Grid数量;
TotalMemory: 2.1475e+09,AvailableMemory: 1.6579e+09,显存2G,实际可用1.6G。
在Matlab中最简单的调用方法是使用gpuArray()函数数据放到GPU上运算,再用gather()函数将结果取回。下面的简单示例说明工作区的变量a通过gpuArray函数被放到了GPU中,在GPU中完成了取绝对值的计算,并通过gather函数将结果取回。
你也可以直接在GPU中产生数据进行运算,例如上图中的变量e。这只是一个简单的示例,更多的内容还需要你根据自己的需求去应用。下图显示的是Matlab自带的并行计算工具箱。
对于一些复杂的无法用matlab内部函数进行GPU加速的代码,Matlab还提供了一个更强大的工具,就是调用.cu文件。matlab+c混合编程把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。需要了解的请自行搜索查找方法。
联系客服