### MATLAB - CUDA
MATLAB下使用CUDA。
#@author: gr
#@date: 2014-04-08
#@email: forgerui@gmail.com
一、 Matlab & C
1. 概念
Matlab 与 C 混编可以提高程序运行效率。
2. C文件
C文件需要在引入头文件mex.h,我的mex.h位置在/opt/MATLAB/R2013a/extern/include/mex.h。
#include <mex.h>
Matlab与C文件的接口函数是mexFunction。
mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]){
// entry
}
mexFunciton就像main函数一样,是Matlab调用的入口。其中,nlhs是输出参数个数,plhs是输出参数;nrhs是输入参数个数,prhs是输入参数,它是一个只读的变量。
3. 常用函数
4. 编译
需要将C语言源文件编译成可执行文件才能被Matlab调用,并且编译出来的文件比同名的.m文件执行优先级更高,即如果两个同名先执行编译出来的文件。
编译分两个步骤,先编译生成.o中间文件(windows下是.obj),再链接生成.mexa64文件(linux32位是.mexglx,windows是.mexw64),这个.mexa64文件可以直接被Matlab使用。
具体操作是打开Matlab,进入要编译文件的文件夹,要先配置一下编译器。
# configure the compiler
mex -setup
# compile
mex -c hello.c -o hello.o
# link
mex -O hello.o
之后在Matlab中直接敲hello便可以调用hello程序。

二、Matlab & CUDA
1. Cuda的kernel函数
代码分为两部分,一部分代码在主机(host)上执行,另一部分则在设备(device)上执行,kernel函数是在GPU上执行的函数。
进行Cuda编译的一般步骤:
- 在主机上申请device内存
- 将主机数据拷贝到设备上
- 在设备上进行运算
- 主机将设备上的运算结果拷贝回主机内存
- 释放设备内存
如下定义kernel函数:
__global__ static void kernel_function(int* a, int* b, int* c){
// realted code
}
2. Cuda的启动
在主机上通过调用kernel函数名进行启动。
# 启动
kernel_function<<<block, thread>>>(a, b, c);
其中thread是一个block中启动的线程数,而block是需要划分为多少个block.块内的thread可以时行数据同步和共享内存,不同的block之间无法进行同步。a, b, c是相关的参数。
具体CUDA相关知识请看博客。
3. 编译
因为Cuda有自己的编译器nvcc,所以需要调用这个编译器去编译C文件。我们可以在Matlab中利用一个脚本进行编译。
nvmex('hello.c');
function [ path, filename, zaet, fd ] = nvmex( cuFileName )
%NVMEX Summary of this function goes here
% Detailed explanation goes here
file_split = regexp(cuFileName, '\.', 'split');
filename = file_split{1};
if ispc % Windows
CUDA_LIB_LOCATION = 'C:\CUDA\lib';
Host_Compiler_Location = '-ccbin "D:\Program Files\Microsoft Visual Studio 9.0\VC\bin"';
PIC_Option = '';
else % Mac and Linux
CUDA_LIB_Location = '/usr/local/cuda/lib64';
Host_Compiler_Location = '';
PIC_Option = '--compiler-options -fPIC';
end
% compile .o file
nvccCommandLine = [ ...
'nvcc --compile ' cuFileName ' ' Host_Compiler_Location ' ' ...
' -o ' filename '.o ' ...
PIC_Option ...
' -I' matlabroot '/extern/include ' ...
];
disp(nvccCommandLine);
status = system(nvccCommandLine);
if status < 0
error 'Error invoking nvcc';
end
% link .mexa64 file
mexCommandLine = ['mex (''' filename '.o'', ''-L' CUDA_LIB_Location ''', ''-lcudart'')'];
disp(mexCommandLine);
eval(mexCommandLine);
end
### MATLAB - CUDA的更多相关文章
- Matconvnet笔记(一)
参考网址:http://www.vlfeat.org/matconvnet/ 内容参考博客:http://blog.sina.com.cn/s/blog_92cd3a1c0102x1ch.html M ...
- rcnn caffe matlab 配置完成 14.04 cuda 7.0
http://blog.csdn.net/real_myth/article/details/42672381 各种痛苦.实验室网速还是龟速. 莫名其妙的错误. gcc还降级到4.7,opencv 3 ...
- 手把手教你搭建深度学习平台——避坑安装theano+CUDA
python有多混乱我就不多说了.这个混论不仅是指整个python市场混乱,更混乱的还有python的各种附加依赖包.为了一劳永逸解决python的各种依赖包对深度学习造成的影响,本文中采用pytho ...
- ubuntu14.04下安装cudnn5.1.3,opencv3.0,编译caffe及配置matlab和python接口过程记录
已有条件: ubuntu14.04+cuda7.5+anaconda2(即python2.7)+matlabR2014a 上述已经装好了,开始搭建caffe环境. 1. 装cudnn5.1.3,参照: ...
- Caffe + Ubuntu 14.04 64bit + CUDA 6.5 配置说明
本文安装显卡驱动的方式已经过时, 最新安装说明请参考发布在Gist上的这篇文章,如有任何疑问,仍然欢迎在本文下留言 :P (本文档使用同一块NVIDIA显卡进行显示与计算, 如分别使用不同的显卡进行显 ...
- Caffe配置简明教程 ( Ubuntu 14.04 / CUDA 7.5 / cuDNN 5.1 )
1. 前言 本教程使用的系统是Ubuntu 14.04 LTS 64-bit,使用的CUDA版本为7.5,使用的NVIDIA驱动版本为352. 如果您使用的Pascal架构显卡,如GTX1080或者新 ...
- win7 64 旗舰版虚拟GPU-VMware下+vs2013安装caffe+matlab+python
转发请说明来处 Win7配置caffe(无GPU) 配置环境: 必须:win7 64 + vs2013 Win7 64位旗舰版要升级到service spack(因为是在vs2013下,想安装vs20 ...
- UBUNTU 14.04 + CUDA 7.5 + CAFFE
这个也是困扰我很久的问题,之前用 http://www.cnblogs.com/platero/p/3993877.html 的安装方法,装了五六七八九十次,总是出问题. 后来找到了一种新的方法,一个 ...
- [转]caffe+Ubuntu14.0.4 64bit 环境配置说明(无CUDA,caffe在CPU下运行) --for --Amd
caffe是一个简洁高效的深度学习框架,具体介绍可以看这里,caffe环境配置过程可以参考这里,我在搭建环境时搜集了许多资料,这里整理了一下,介绍一下caffe在无CUDA的环境下如何配置. 1. 安 ...
随机推荐
- A Tour of Go Maps
A map maps keys to values. Maps must be created with make (not new) before use; the nil map is empty ...
- python 定制类
看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的. __slots__我们已经知道怎么用了,__len__()方法我们也知道是为了能让cla ...
- WinForm中当TextBox重新获得焦点时输入法失效问题
在winform 中,每当TextBox获得焦点时,部分输入法会失效(如智能ABC.五笔98.极品五笔等),需要重新切换输入法才能正常使用. 此时要将Form的ImeMode属性改为:OnHalf(或 ...
- mssql存储过程demo
ALTER PROCEDURE [dbo].[sp_get_saleData]ASBEGIN set nocount on -- 获取最近上传数据的时间戳 declare @dd datetime s ...
- java类的访问控制符与其他几个特殊修饰符的总结
1 访问控制符 1.1 字段或者方法的访问控制符 同一个类中 同一个包中 不同包中的子类 不同包中的非子类 private YES 默认(包可访问) YES YES prot ...
- angular中的promise
angular中的promise用法 标签(空格分隔): angular 前言 Promise其实是一个规范,用类似then().then()这样的链式调用形式来处理因为异步带来意大利面条式的代码(多 ...
- 精彩,sinox.org官网贴满winxp死亡大字报
sinox杀死windowxp不可避免,不用说,微软还自己掐死他!!! 中国人会升级正版 windows7吗?昨天也许会,但今天不会了,因为 sinox大字报出来了! 这下举国皆知了. 换装sinox ...
- RocketMQ在linux平台下环境搭建
RocketMQ在linux下部署运行和window类似,只不过启动namesrv和broker是通过mqnamesrv.sh 和 mqbroker.sh来启动的. 一. 环境搭建 需要jdk1.6 ...
- 关系数据库 范式(NF: Normal Form) 说明
关系数据库 范式(NF: Normal Form) 说明 数据库电话insertdelete存储oracle 目录(?)[+] 一.范式概述(NF:NormalForm) 数据库的设计范式是数 ...
- eclipse项目导入到Android Studio Plugin with id 'android-library' not found
在主项目的build.gradle 中加入以下代码buildscript { repositories { mavenCentral() } dependencies { classpath 'com ...