MATLAB OpenMP - eiichiromomma/CVMLAB GitHub Wiki

(MATLAB) OpenMP

MacでOpenMPをmexから使う。

clang-ompの導入

$brew install clang-omp

インストール先は /usr/local/opt/libiomp 。

clang-omp の確認

#include <omp.h>
#include <stdio.h>
int main() {
#pragma omp parallel
        printf("Hello from thread %d, nthreads %d\n", omp_get_thread_num(),     omp_get_num_threads());
}

のような内容でtestomp.cを作成する。

$clang-omp -fopenmp testomp.c -o testomp -I/usr/local/opt/libiomp/include/libiomp/ -L/usr/local/lib -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.xx.sdk/usr/include -liomp5

でコンパイル。OSXのSDKは持ってるバージョンに合わせる。

$ ./testomp
Hello from thread 0, nthreads 4
Hello from thread 2, nthreads 4
Hello from thread 3, nthreads 4
Hello from thread 1, nthreads 4

のように持ってる環境のコア数だけ出てくれば成功

MATLABの設定

とりあえず対応するバージョンのXcodeを入れる。古いMATLABの場合はSDKだけでも持ってきて新しいXcodeの中の所定の場所へコピーしておく。

#include "mex.h"
#include <omp.h>

void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
#pragma omp parallel
    mexPrintf("Hello from thread %d, nthreads %d\n", omp_get_thread_num(),omp_get_num_threads());
}

をtestmexomp.cとして保存。CC=でコンパイラ,CFLAGSで-fopenmp,-Iでインクルードファイルの場所の指定が必要。 ライブラリについては-Lで場所,-lでライブラリファイルを指定するが,Macの場合DYLD_LIBRARY_PATHにもパスを通す必要があるのでsetenvで設定する。

>>setenv('DYLD_LIBRARY_PATH',['/usr/local/opt/libiomp/lib:' getenv('DYLD_LIBRARY_PATH')])
>>mex -v CC='/usr/local/bin/clang-omp' CFLAGS='$CFLAGS -fopenmp' -I/usr/local/opt/libiomp/include/libiomp '-L/usr/local/opt/libiomp/lib/' -liomp5 testmexomp.c
>> testmexomp
Hello from thread 0, nthreads 4
Hello from thread 3, nthreads 4
Hello from thread 2, nthreads 4
Hello from thread 1, nthreads 4

となれば成功。

Symbol not found:
___kmpc_cancel_barrier
  Referenced from: /Users/xxxxxx/testmexomp.mexmaci64
  Expected in: /Applications/MATLAB_R201xx.app/sys/os/maci64/libiomp5.dylib
 in /Users/xxxxxx/testmexomp.mexmaci64

となった場合はlibiomp5.dylibがMATLAB内にあり,それを使ってしまっているのでmvする。

$cd /Applications/MATLAB_R201xx.app/sys/os/maci64/
$sudo mv libiomp5.dylib org_libiomp5.dylib

としてmexからやり直すと/usr/local/opt...の方を拾ってくれる。

⚠️ **GitHub.com Fallback** ⚠️