首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mac上用mex在Matlab中实现Openmp

在mac上用mex在Matlab中实现Openmp
EN

Stack Overflow用户
提问于 2016-05-21 11:38:09
回答 1查看 2.6K关注 0票数 3

我有OpenMP和Matlab,我想使用以前工作过的R2016a。我通过自制安装了gcc-5,并在那里工作。我可以从这个线程GCC C/C++ MEX Matlab R2015 Mac (与OpenMP)不工作中看到,至少在R2014a中,手动插入和编辑mexopts.sh是可能的。但是,为了将编译器标志(CC)重定向到使用-fopenmp标志的gcc-5编译器,我不需要使用这样的文件。

有什么建议吗?我走错路了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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):

代码语言:javascript
复制
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并按如下方式修改它:在开始时,输入名称等的不同值,以便能够区分它:

代码语言:javascript
复制
Name="LLVM Clang++ OpenMP"
ShortName="Clang++ OpenMP"
Manufacturer="LLVM"

CXX的定义更改为指向与brew一起安装的clang的位置。在默认位置,这应该是

代码语言:javascript
复制
CXX="/usr/local/opt/llvm/bin/clang++"

-fopenmp -Wall -I/usr/local/opt/llvm/include添加到CXXFLAGS,因此它将读取

代码语言:javascript
复制
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,使其类似于

代码语言:javascript
复制
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提示符下输入:

代码语言:javascript
复制
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,这样它可能会读到

代码语言:javascript
复制
LDPATH_PREFIX='/usr/local/opt/llvm/lib'

重新启动MATLAB。

测试配置

创建包含以下内容的文件mex_par_test.cpp

代码语言:javascript
复制
#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提示符下编译:

代码语言:javascript
复制
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

  • Matlab2016b将生成配置和其他文件存储在/Users/username/Library/Application Support/MathWorks/MATLAB/R2016b中,而不是在用户主文件夹中的.matlab/R*/中(检查prefdir)。
  • 如果使用了上述设置,则在更新macOS 10.12之后,MATLAB将在启动时崩溃。要使它立即工作,只需注释掉LDPATH_PREFIX行中的~/.matlab7rc.sh。事实上,操作系统、clang和MATLAB的组合不应该需要LDPATH_PREFIX
  • 我发现我不得不重新安装llvmbrew reinstall llvm
  • MATLAB附带了自己版本的libiomp5,这应该是与之相关联的。更改构建配置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。所以我的CXXFLAGSLDFLAGS现在读 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。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37362414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档