使用MATLAB的Mex文件以及OPENMP加速

Why MEX

由于matlab的迭代器不太给力,Mathworks建议大家尽量将程序向量化。但是我们有时候需要使用for 循环,这时可以自己编写c代码再编译成mex文件。这样就可以在matlab中调用。同时以后的c模块也可以通过编写mex文件来与matlab交互。

Hello world!

下面是一段简单的c代码,可以把它保存为helloworld.c, 然后在matlab执行 mex helloworld.c 编译。然后运行 helloworld()

//You can include any C libraries that you normally use
#include "math.h"
#include "mex.h"   //--This one is required

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    //All code and internal function calls go in here!
    printf("Hello world!\n");
    return;
}

 

使用OpenMP加速

OpenMP可以充分现在多核处理器的多个核心来进行并行运算。使用起来也很简单
首先在文件头插入引用

#include<omp.h>

然后在需要并行化的代码里加入openmp指令

#pragma omp parallel for
for (i_b = 0; i_b < n2; i_b++)
{
    /* code */
    int code,sum,loc;

    sum=0;

    for (code = 0; code<d; code++)
    {
        /* code */
        loc = C1[i_a*d+code]+C2[i_b*d+code]*256;
        sum = sum+T[loc];
    }
    D[i_b*n1+i_a] = sum;
}

 

这里调用是通过#pragma 命令执行的。
最后,需要编译成mex文件,可以通过在matlab内执行mex命令来实现。使用OpenMP需要打开对应的编译器开关,命令如下:

mex youfile.c COMPFLAGS="/openmp $COMPFLAGS"

 

这样才能在执行时加入openMP支持。