我有Matlab代码,它使用稀疏和'\'作为线性系统的求解器。我手工定制了一个C ++函数,它使用来自Eigen的conjage梯度稀疏求解器,以便使用编码器工具箱在Matlab外部运行代码,以导出其余的Matlab代码。我导出一个静态库,我能够在我的远程系统上编译和执行它,没有任何问题。但是,我无法使用多线程运行代码。我试图将其导出为Matlab可执行文件(mex),整个代码并行运行,没有Matlab内部的问题。
所以我的结论是,我的远程系统上的编译器/链接器标志必须有所不同。我在编译器和链接器中都使用-fopenmp,然后用OMP_NUM_THREADS = n运行可执行文件,如果我在程序中读出“n”,我得到的数字与执行时相同。
我的问题是,除了需要与我的特定代码相关的东西之外,我是否需要在我的编译器/链接器中包含任何其他东西,以便让Eigen运行多线程?
更新:
在远程系统上我做:
g++ -c -m64 -fopenmp -std=c++11 -I /usr/local/include/Eigen/src/misc/
~/src/myHandTailoredFile.cpp -o ~/src/myHandTailoredFile.o
和链接器选项
-fopenmp -L /usr/local/lib64/ -llapack -L /usr/local/lib/ -lcurl
将我的手工定制文件与myBigProgram一起编译成我做的Mex文件
g++ -DHAVE_LAPACK_CONFIG_H -DLAPACK_COMPLEX_STRUCTURE -DMW_HAVE_LAPACK_DECLS -c -ansi -fexceptions -fPIC -fno-omit-frame-pointer -pthread -D_GNU_SOURCE -DMATLAB_MEX_FILE -std=c++0x -fopenmp -DOMPLIBNAME="\"/usr/local/MATLAB/R2016a/sys/os/glnxa64/libiomp5.so\"" -O -DNDEBUG -I "/usr/local/MATLAB/R2016a/simulink/include" -I "/usr/local/MATLAB/R2016a/toolbox/shared/simtargets" -I "./interface" -I "/usr/local/lib" -I "/usr/local/MATLAB/R2016a/extern/include" -I "." "~/src/myHandTailoredFile.cpp"
将链接器选项设置为
-pthread -Wl,--no-undefined -Wl,-rpath-link,/usr/local/MATLAB/R2016a/bin/glnxa64 -shared -L/usr/local/MATLAB/R2016a/bin/glnxa64 -lmx -lmex -lmat -lm -lstdc++ -lcurl -fPIC -L/usr/local/MATLAB/R2016a/sys/os/glnxa64 -liomp5 -o myBigProgram_mex.mexa64 -L"/usr/local/MATLAB/R2016a/bin/glnxa64" -lmwblas -lmwlapack -lemlrt -lcovrt -lut -lmwmathutil
请注意,后者的编译器和链接器选项完全由Matlab定义。