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: 支持的编译器和兼容编译器 – 版本R2015a中的受支持编译器列表
编辑!!!
甚至Windows也不支持GCC编译器。 但是,如果您可以在Windows中构建库,则会有一个名为Gnumex的第三方库,旨在为Matlab MEX提供MinGW或CygWin GCC编译器function。 看一看。
他们网站上的更新说改为Matlab已经破坏了它们的实用性。 但是,似乎有一个解决方法可通过此StackOverflowpost。
最后,我找到了一种解决问题的正确方法……首先,默认情况下文件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文件中包含
:
g++-4.9 -o test hello.cpp -fopenmp
要么
g++ -o test hello.cpp -fopenmp
也可能是文件已损坏且必须执行无法编译fortran因为dyld:库未加载 :
brew rm cloog brew install cloog
(但先检查一下)……
也有可能如果你不能用OMP编译就必须先做这里描述的几件事( 在OS X Yosemite上使用gcc编译器编译OpenMP程序 ):1。从http:/获得一个新的gcc编译器/hpc.sourceforge.net/ 2.放置一个新的可执行文件夹,由$ sudo tar -xvf gcc-4.9-bin.tar -C / 3.通过导出切换到它PATH = / usr / local / bin:$ PATH
最后,尝试编译您的MEX文件:
mex hello.cpp COMPFLAGS="/openmp $COMPFLAGS"
而已 … 。
我无法获得mexopts.sh工作方法。
相反,我首先遵循这一点,以确保我可以使用omp在xcode 下使用xcode: clang-omp
那么mex编译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
我可以使用这个包装文件从命令行编译它:
#include "stdio.h" #include "math.h" #include #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 #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调用时它都不会返回相同的数字,即使它是从终端执行的。