### 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. 安 ...
随机推荐
- IOS获取摄像和本地中的资源
上传文件时,我们都的从本地中选择或用相机来拍摄得到文件. 一个上传按钮,单击事件 1 -(IBAction)btnClick{ 2 UIActionSheet* actionSheet = [[UIA ...
- 转载ASP.NET 状态管理Application,Session,Cookie和ViewState用法
转载原地址 http://www.cnblogs.com/cuishao1985/archive/2009/09/24/1573403.html ASP.NET状态管理 APPlication,Ses ...
- (step 4.3.5)hdu 1035(Robot Motion——DFS)
题目大意:输入三个整数n,m,k,分别表示在接下来有一个n行m列的地图.一个机器人从第一行的第k列进入.问机器人经过多少步才能出来.如果出现了循环 则输出循环的步数 解题思路:DFS 代码如下(有详细 ...
- hdu 4607 (树形DP)
当时比赛的时候我们找出来只要求出树的最长的边的节点数ans,如果要访问点的个数n小于ans距离直接就是n-1 如果大于的话就是(n-ans)*2+ans-1,当时求树的直径难倒我们了,都不会树形dp ...
- Notepad++的一些常用的快捷键
ctrl+/ 一个一个单词的往后跳Ctrl+H 替换Ctrl+F 查找Ctrl+D 复制当前行到下一行Ctrl+L 删除当前行Ctrl+Shift+F 在文件中找F5 打开run对话框F11 全屏 ...
- byte数组和int互转
import java.nio.ByteBuffer; public class Program { public static void main(String[] args) { ByteBuff ...
- Microsoft .NET Pet Shop 4
Microsoft .NET Pet Shop 4:将 ASP.NET 1.1 应用程序迁移到 2.0 299(共 313)对本文的评价是有帮助 - 评价此主题 发布日期 : 2006-5-9 | 更 ...
- 邮件Mail
邮件开发准备: 准备工作, 环境搭建: 1. 本地搭建一个邮件服务器 -à 易邮服务器,eyoumailserversetup.exe 2. 新建邮箱账号 张三给李四发邮件. 步骤1: 新建域名: 工 ...
- EF如何正确的进行实体中修改
本文转载:http://www.cnblogs.com/Ruiky/archive/2012/12/29/2839011.html 不推荐方式一: 思路:先从ObjectContext取出实体,然后将 ...
- iOS 改变tableview cell的背景色
cell.selectedBackgroundView = [[UIView alloc] initWithFrame:cell.frame]; cell.selectedBackgroundView ...