MATLAB下使用CUDA。

#@author:       gr
#@date: 2014-04-08
#@email: forgerui@gmail.com

一、 Matlab & C

1. 概念

MatlabC 混编可以提高程序运行效率。

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编译的一般步骤:

  1. 在主机上申请device内存
  2. 将主机数据拷贝到设备上
  3. 在设备上进行运算
  4. 主机将设备上的运算结果拷贝回主机内存
  5. 释放设备内存

如下定义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的更多相关文章

  1. Matconvnet笔记(一)

    参考网址:http://www.vlfeat.org/matconvnet/ 内容参考博客:http://blog.sina.com.cn/s/blog_92cd3a1c0102x1ch.html M ...

  2. rcnn caffe matlab 配置完成 14.04 cuda 7.0

    http://blog.csdn.net/real_myth/article/details/42672381 各种痛苦.实验室网速还是龟速. 莫名其妙的错误. gcc还降级到4.7,opencv 3 ...

  3. 手把手教你搭建深度学习平台——避坑安装theano+CUDA

    python有多混乱我就不多说了.这个混论不仅是指整个python市场混乱,更混乱的还有python的各种附加依赖包.为了一劳永逸解决python的各种依赖包对深度学习造成的影响,本文中采用pytho ...

  4. ubuntu14.04下安装cudnn5.1.3,opencv3.0,编译caffe及配置matlab和python接口过程记录

    已有条件: ubuntu14.04+cuda7.5+anaconda2(即python2.7)+matlabR2014a 上述已经装好了,开始搭建caffe环境. 1. 装cudnn5.1.3,参照: ...

  5. Caffe + Ubuntu 14.04 64bit + CUDA 6.5 配置说明

    本文安装显卡驱动的方式已经过时, 最新安装说明请参考发布在Gist上的这篇文章,如有任何疑问,仍然欢迎在本文下留言 :P (本文档使用同一块NVIDIA显卡进行显示与计算, 如分别使用不同的显卡进行显 ...

  6. Caffe配置简明教程 ( Ubuntu 14.04 / CUDA 7.5 / cuDNN 5.1 )

    1. 前言 本教程使用的系统是Ubuntu 14.04 LTS 64-bit,使用的CUDA版本为7.5,使用的NVIDIA驱动版本为352. 如果您使用的Pascal架构显卡,如GTX1080或者新 ...

  7. win7 64 旗舰版虚拟GPU-VMware下+vs2013安装caffe+matlab+python

    转发请说明来处 Win7配置caffe(无GPU) 配置环境: 必须:win7 64 + vs2013 Win7 64位旗舰版要升级到service spack(因为是在vs2013下,想安装vs20 ...

  8. UBUNTU 14.04 + CUDA 7.5 + CAFFE

    这个也是困扰我很久的问题,之前用 http://www.cnblogs.com/platero/p/3993877.html 的安装方法,装了五六七八九十次,总是出问题. 后来找到了一种新的方法,一个 ...

  9. [转]caffe+Ubuntu14.0.4 64bit 环境配置说明(无CUDA,caffe在CPU下运行) --for --Amd

    caffe是一个简洁高效的深度学习框架,具体介绍可以看这里,caffe环境配置过程可以参考这里,我在搭建环境时搜集了许多资料,这里整理了一下,介绍一下caffe在无CUDA的环境下如何配置. 1. 安 ...

随机推荐

  1. C语言/C++中怎样产生随机数

    C语言/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,和time()函数. 需要说明的是,iostream头文件中就有srand函数的定义,不需要再额外引入stdlib. ...

  2. 软交换和IMS是什么关系

    软交换是一种功能实体,为下一代网络NGN提供具有实时性要求的业务的呼叫控制和连接控制功能,是下一代网络呼叫与控制的核心. 简单地看,软交换是实现传统程控交换机的"呼叫控制"功能的实 ...

  3. Unity3D资源存放笔记

    文件夹及路径 昨天记了一篇AssetBundle学习笔记,那么游戏中的各种资源应该如何存放呢? 在网上一阵搜罗,把笔记记一下. 非特殊名称文件夹 非Unity3D指定名称的文件夹中的资源,如果游戏场景 ...

  4. MSSQLSERVER数据库- LEFT JOIN后面跟着WHERE竟变成内联 解决方法

    在LEFT JOIN后面跟着WHERE竟变成内联.百度后看到这个解决方法. 记录如下: select sre.*, co.description from subscribedratingelemen ...

  5. linux安装oracle

    目 录 一.硬件要求二.软件三.系统安装注意四.安装Oracle前的系统准备工作五.安装Oracle,并进行相关设置六.升级Oracle到patchset 10.2.0.4七.使用rlwrap调用sq ...

  6. FloatingActionButton

    https://github.com/Clans/FloatingActionButton    

  7. ios开发——实用技术OC篇&地图与定位

    地图与定位 11.1 iOS定位服务 11.2 iOS地图 11.3 Web地图 1 iOS定位服务 iOS中有三个定位服务组件: Wifi定位,通过查询一个Wifi路由器的地理位置的信息.比较省电, ...

  8. 使用日志服务LogHub替换Kafka

    https://yq.aliyun.com/articles/35979#index_section

  9. careercup-中等难度 17.12

    17.12 设计一个算法,找出数组中两数之和为指定值的所有整数对. 解答 时间复杂度O(n)的解法 我们可以用一个哈希表或数组或bitmap(后两者要求数组中的整数非负)来保存sum-x的值, 这样我 ...

  10. String使用equals方法和==分别比较的是什么?

    equals方法和==的区别   首先大家知道,String既可以作为一个对象来使用,又可以作为一个基本类型来使用.这里指的作为一个基本类型来使用只是指使用方法上的,比如String s = &quo ...