我正在尝试使用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调用时也不会返回相同的数字。