我有OpenMP和Matlab,我想使用以前工作过的R2016a。我通过自制安装了gcc-5,并在那里工作。我可以从这个线程GCC C/C++ MEX Matlab R2015 Mac (与OpenMP)不工作中看到,至少在R2014a中,手动插入和编辑mexopts.sh是可能的。但是,为了将编译器标志(CC)重定向到使用-fopenmp标志的gcc-5编译器,我不需要使用这样的文件。
有什么建议吗?我走错路了吗?
发布于 2016-08-31 19:18:17
更新macOS 10.12,Matlab2016b:以下的一般原理仍然有效。向下滚动我必须做的更改。
clang已经被更新以包含OpenMP支持,但是Xcode 7.3.1所安装的版本还不支持OpenMP。相反,它可以与homebrew一起安装。使用前解的clang-omp不再工作了,因为clang-omp已经从brew中删除了。
下面的过程已经在MacOSX10.11.6,clang3.8.1,MATLAB 2016a上进行了测试。
安装llvm
从brew安装当前版本的brew(来自Terminal):
brew install llvm修改MATLAB构建配置
然后,将默认的mex编译器配置文件复制到MATLAB配置目录中。要找到默认配置,请在MATLAB提示符上输入mex -setup C++。一个选项应该是这样的
Xcode Clang++ mex -setup:/Applications/Matlab/MATLAB_R2016a/MATLAB_R2016a.app/bin/maci64/mexopts/clang++_maci64.xml C++
(在这里和以后,我们将假设Matlab2016a是使用的版本)。将/Applications/Matlab/MATLAB_R2016a/MATLAB_R2016a.app/bin/maci64/mexopts/clang++_maci64.xml复制到~/.matlab/R2016a,并将其命名为clang++_openmp_maci64.xml,以便能够区分它。在文本编辑器中打开clang++_openmp_maci64.xml并按如下方式修改它:在开始时,输入名称等的不同值,以便能够区分它:
Name="LLVM Clang++ OpenMP"
ShortName="Clang++ OpenMP"
Manufacturer="LLVM"将CXX的定义更改为指向与brew一起安装的clang的位置。在默认位置,这应该是
CXX="/usr/local/opt/llvm/bin/clang++"将-fopenmp -Wall -I/usr/local/opt/llvm/include添加到CXXFLAGS,因此它将读取
CXXFLAGS="-fno-common -arch x86_64 -mmacosx-version-min=$SDKVER -fexceptions -isysroot $ISYSROOT -fobjc-arc -std=c++11 -stdlib=libc++ -fopenmp -Wall -I/usr/local/opt/llvm/include"将-L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib -fopenmp添加到LDFLAGS,使其类似于
LDFLAGS="-Wl,-twolevel_namespace -undefined error -arch x86_64 -mmacosx-version-min=$SDKVER -Wl,-syslibroot,$ISYSROOT -framework Cocoa $LDBUNDLE $LINKEXPORT -stdlib=libc++ -L/usr/local/opt/llvm/lib -Wl,-rpath,/usr/local/opt/llvm/lib -fopenmp"若要激活此生成配置,请在MATLAB提示符下输入:
mex -setup:~/.matlab/R2016a/clang++_openmp_maci64.xml C++修改MATLAB运行时变量
现在,MATLAB必须知道库在运行时的位置。检查是否有文件~/.matlab7rc.sh。如果没有,请将模板从matlabroot/bin复制到主目录中。在文本编辑器中打开此文件。向下滚动到mac|maci|maci64)部分(第188 ff行)。将/usr/local/opt/llvm/lib添加到LDPATH_PREFIX,这样它可能会读到
LDPATH_PREFIX='/usr/local/opt/llvm/lib'重新启动MATLAB。
测试配置
创建包含以下内容的文件mex_par_test.cpp
#include "mex.h"
#if defined(_OPENMP)
#include <omp.h>
#endif
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
#if defined(_OPENMP)
if (nrhs > 0) {
omp_set_num_threads(mxGetScalar(prhs[0]));
}
{
mexPrintf("If parallel processing is enabled, you should see the line\n\"Hello world from thread x\", where 'x' represents a thread number.\nThere will be %i threads in parallel.\n\n", omp_get_max_threads());
#pragma omp parallel
{
#pragma omp critical
mexPrintf("Hello world from thread %i.\n", omp_get_thread_num());
}
}
#else
mexPrintf("SSIMS Toolbox was not compiled with support for parallelization.\n\n");
#endif
}它应该在MATLAB提示符下编译:
mex mex_par_test.cpp
Building with 'LLVM Clang++ OpenMP'. MEX completed successfully.
用mex_par_test调用已编译的函数应该会产生如下结果
如果启用了并行处理,那么您应该会看到一行"Hello from线程x",其中'x‘代表一个线程号。将有12个线程并行。
Hello world from thread 0. Hello world from thread 3. Hello world from thread 8. Hello world from thread 1. Hello world from thread 2. Hello world from thread 11. Hello world from thread 4. Hello world from thread 7. Hello world from thread 10. Hello world from thread 9. Hello world from thread 5. Hello world from thread 6.
macOS 10.12更新,Matlab2016b
/Users/username/Library/Application Support/MathWorks/MATLAB/R2016b中,而不是在用户主文件夹中的.matlab/R*/中(检查prefdir)。LDPATH_PREFIX行中的~/.matlab7rc.sh。事实上,操作系统、clang和MATLAB的组合不应该需要LDPATH_PREFIX。llvm:brew reinstall llvmlibiomp5,这应该是与之相关联的。更改构建配置XML (clang++_openmp_maci64.xml),以便将-fopenmp的每个关联替换为-fopenmp=libiomp5。在每次出现-L$MATLABROOT/sys/os/maci64之前添加-L/usr/local/opt/llvm/lib。最后,链接器选项应该是-Wl,-rpath,$MATLABROOT/sys/os/maci64:/usr/local/opt/llvm/lib而不是-Wl,-rpath,/usr/local/opt/llvm/lib。所以我的CXXFLAGS和LDFLAGS现在读
CXXFLAGS=-fno-公共-arch x86_64 -fexceptions -fobjc-圆弧-std=c++11 -stdlib=libc++ -fopenmp=libiomp5 -Wall -i/usr/local/opt/llvm/包括“LDFLAGS=" -Wl,-twolevel_namespace -undefined error -arch x86_64 -Wl $LDBUNDLE x86_64 x86_64-arch x86_64-Wl$LDBUNDLE x86_64-twolevel_namespace -L$MATLABROOT/sys/os/maci64 -L/usr/local/opt/llvm/lib,,en21#”这将使上面的示例再次编译,而不是崩溃MATLAB。
https://stackoverflow.com/questions/37362414
复制相似问题