MATLAB OpenMP - eiichiromomma/CVMLAB GitHub Wiki
(MATLAB) OpenMP
MacでOpenMPをmexから使う。
$brew install clang-omp
インストール先は /usr/local/opt/libiomp 。
#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
のように持ってる環境のコア数だけ出てくれば成功
とりあえず対応するバージョンの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...の方を拾ってくれる。