GCC C/C++ MEX Matlab R2015 Mac OS X(带OpenMP)不起作用



我正在尝试使用GCC/g++在Matlab中编译一个非常简单的MEX文件…首先,我检查了这已经安装在matlab中:!这gcc

输出:/usr/bin/gcc……之后,我尝试做以下操作:

mex -v GCC='/usr/bin/GCC ' hello.c

,但它仍然与XCode Clang编译…这是使用g++和OPENMP库进行并行计算。

是已知的,不被Mathworks官方支持,但可能。

MATLAB在Mac上只支持XCode 5.1+或6.0。

查看以下支持的编译器列表,来自Mathworks:支持的编译器和兼容的编译器- Release R2015a


编辑! !

即使是Windows也不支持GCC编译器。但是,如果您可以在Windows中构建库,那么有一个名为Gnumex的第三方库,旨在为Matlab MEX提供MinGW或CygWin GCC编译器功能。看一看

他们网站上的更新说,改成Matlab已经破坏了他们的效用。然而,似乎有一个解决方案可以通过这个StackOverflow帖子。

最后,我找到了一个合适的方法来解决这个问题…首先,文件mexopts.sh默认情况下不会出现在文件夹中,必须打开终端并查找并创建它(然后Matlab将在使用MEX编译时自动重定向到它):

find ~/ -name 'mexopts.sh' 

和将出现:

/Users/FOO//.Trash/MATLAB_R2014a.app/bin/mexopts.sh

然后复制为:

cp /Users/FOO//.Trash/MATLAB_R2014a.app/bin/mexopts.sh ~/.matlab/R2014a

,然后进入文件夹cd ~/.matlab/R2014a并将用户权限更改为:

chmod u+rwx mexopts.sh

然后,用默认的文本编辑器(推荐使用Sublime文本)打开它:

open mexopts.sh

并编辑以下内容:将出现macosx10.7的地方更改为当前版本,在我的例子中是macos10.10然后,按照(http://www.mathworks.com/matlabcentral/newsreader/view_thread/334250):

)中所述修改以下行
# CC='xcrun -sdk macosx10.7 clang' #OLD
CC='xcrun /usr/local/bin/gcc' #NEW

# CXX='xcrun -sdk macosx10.7 clang++' #OLD
 CXX='xcrun /usr/local/bin/g++' #NEW

# CLIBS="$CLIBS -lstdc++" #OLD
CLIBS="$CLIBS -lstdc++ -I/usr/local/lib -lgomp" #directory <-I/usr/local/lib> #NEW
#CXXLIBS="$MLIBS -lstdc++" #OLD
CXXLIBS="$MLIBS -lstdc++ -I/usr/local/lib -lgomp" #NEW

重要提示:确保当前的g++/g++ 4.9能够使用OpenMP进行编译,尝试在hello world文件中包含<omp.h>,在命令行中执行:

g++-4.9 -o test hello.cpp -fopenmp

g++ -o test hello.cpp -fopenmp

也可能是一个文件被损坏了,并且必须这样做:Can not compile fortran because dyld: Library not loaded:

brew rm cloog
brew install cloog

(但先检查)…

也有可能,如果你不能用OMP编译,有必要先做下面描述的几件事(在OS X Yosemite上用gcc编译器编译OpenMP程序):1. 从http://hpc.sourceforge.net/获得了一个新的gcc编译器2. 在$ sudo tar -xvf gcc-4.9-bin.tar -C/下新建一个可执行文件夹3.通过export PATH=/usr/local/bin:$PATH

最后,尝试使用以下命令编译MEX文件:

mex hello.cpp COMPFLAGS="/openmp $COMPFLAGS"

就是这样div…

我无法使mexopts.sh方法工作。

相反,我首先遵循了这一点,以确保我可以让omp与xcode一起工作:clang-omp在xcode下的El Capitan

然后mex compile st

mex CC='/usr/local/bin/clang-omp' -I/usr/local/include -I/usr/local/lib /usr/local/lib/libiomp5.dylib test.c

然而,在比较Matlab和基于c的纯终端时,我得到了一些奇怪的结果。常见的工作,我放入文件"do_work.c":

double do_work(int maxit){
    double tmp,x,x2;
    int numThreads=0;
    numThreads = omp_get_max_threads() ;
    // numThreads = 4; 
    printf("Setting max num threads to %d.n",numThreads); 
    omp_set_num_threads(numThreads);
    // int Nthreads=omp_get_num_threads();
    tmp = 0.0; 
    x2 = 0.0; 
    #pragma omp parallel for shared(tmp,x2) private(x) 
        for (int i=0;i<maxit;i++) {
            x = 0.0; 
            for (int k=0; k<10000; k++) x += pow(.011,1.0/.5); // does some heavy computations
            tmp += (double) i ; 
            if (i%1000==0){
                printf("Hello, %dn",i); 
            }
            x2 += x; 
        }
        printf("x2 = %fn",x2); 
    return tmp; 
}

我可以使用这个包装器文件从命令行编译它:

#include "stdio.h"
#include "math.h"
#include <libiomp/omp.h>
#include "do_work.c"
double do_work(int maxit); 
int main(int argc, const char * argv[]) {
    do_work(10000); 
    return 0;
}

我通过运行

编译它
clang-omp -fopenmp test_c_wrapper.c 

我也可以用下面的代码从Matlab连接到它:

#include "mex.h"
#include <libiomp/omp.h>
#include "math.h"
#include "stdio.h"
#include "do_work.c"
double do_work(int maxit); 
void mexFunction(int nlhs, mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
    do_work(10000);
    return;
}

要从Matlab编译此代码,请将其保存为test.c并运行前面提到的第一条mex语句。然而,结果真的很奇怪。看起来好像Matlab甚至没有使用omp。同时,Matlab实际上比基于终端的运行速度更快,即使Matlab似乎以串行模式运行?奇怪的……此外,omp_get_max_threads()的行为很奇怪,即使它从终端调用,每次从Matlab调用时也不会返回相同的数字。

最新更新