Multithreading 检查IPOPT中HSL解算器MA97并行性的示例代码

Multithreading 检查IPOPT中HSL解算器MA97并行性的示例代码,multithreading,matlab,mathematical-optimization,ipopt,Multithreading,Matlab,Mathematical Optimization,Ipopt,我正在解决非线性优化问题。目前,我正在评估不同的算法,以找出哪一种最适合我的问题。我正在Ubuntu 20.04 LTS上使用Matlab2020b 目前,我在HSL解算器启动并运行的情况下获得了IPOPT。我的问题由几百个变量组成(目前大约500个)。切换到MA97没有显示任何性能改进。也许我的问题太小了?尽管如此,我还是想检查与MA27相比,MA97的并行性是否正常工作,因此,如果我正确编译了所有内容 是否存在任何示例问题,我可以验证MA97是否可以使用多线程,但MA27不能使用?建议使用几

我正在解决非线性优化问题。目前,我正在评估不同的算法,以找出哪一种最适合我的问题。我正在Ubuntu 20.04 LTS上使用Matlab2020b

目前,我在HSL解算器启动并运行的情况下获得了IPOPT。我的问题由几百个变量组成(目前大约500个)。切换到MA97没有显示任何性能改进。也许我的问题太小了?尽管如此,我还是想检查与MA27相比,MA97的并行性是否正常工作,因此,如果我正确编译了所有内容


是否存在任何示例问题,我可以验证MA97是否可以使用多线程,但MA27不能使用?

建议使用几种方法:

  • 试着从Matlab调试到本机代码中,看看IPOPT调用了什么。这种方法很棘手,因为Matlab本身使用OpenMP
  • 使用proc文件系统,如果在
    /proc/self/tasks
    下有子目录,则该过程是多线程的。这种方法与上述方法存在相同的问题(Matlab后端可能会使用多线程)
  • 使用环境变量限制OpenMP线程的数量(
    OMP_线程限制
    )并检查性能更改。在调用IPOPT时,需要特别测量这种差异,同样,Matlab将使用OpenMP实现自己的功能
  • Matlab有一个内置的探查器:

    % start profiling
    profile on
    
    % your code ...
    
    % launch profile viewer
    profile viewer
    
    此外,IPOPT日志可能会有所帮助。如果解算器是多线程的,则经过的实时时间和CPU时间之间应该存在差异。这与平行度有关,即

    CPU时间∝ 线程数*实时运行时间


    这是一个粗略的近似值,仅在线程数量受到资源限制时有效。

    应该能够检查是否调用了OpenMP。遗憾的是,我在安装perf时遇到了问题。如果我想安装perf及其所有依赖项,我会遇到错误
    E:找不到包linux-tools-5.4.0-48-generic
    可以通过代码进行调试吗?如果您查看调用堆栈,应该会看到OpenMP方法(来自libiomp/iomp)的并行情况。我没有访问代码的权限。我只能指定ipopt在后台使用的线性解算器,因此,我有一行
    sol=ipopt(…)
    Sure,但您确实需要在本地使用OpenMP LIB,对吗?您可以检查它们是否与GDB一起使用?在共享对象上设置一个断点。谢谢你的提示!第一个选项不起作用,因为IPOPT是一个mex文件(编译的c代码),MATLAB无法对其进行评测(使用评测器时也是这个问题)。对于第二个想法,如果我调用
    dir/proc/self/task
    来显示此文件夹的内容,则启动后已经存在多个文件夹。如果我设置
    OMP\u THREAD\u LIMIT=1
    我会在bash中得到一个警告,说
    OMP:warning\96:不能用4个线程组成一个团队,而是使用1。
    但是这个过程和没有这个设置一样快(没有设置限制,我不会得到警告)Matlab可以调试&profile到一个Mex文件中(参见Mathworks文档),编译Mex时,需要打开一些配置设置(假设您能够重新编译Mex)。如果在更改env变量时性能没有任何变化,则可能意味着IPOPT没有运行多线程,或者在进程外运行IPOPT,或者进程没有看到env变量的变化。从您的进程打印它们以进行验证。确切的问题是,IPOPT mex文件是一个专有文件,我无法编译或重新编译。我得到了ipopt.mexa64的原样。这是我无法深入研究的主要问题。从MATLAB中读取,
    OMP\u NUM\u THREADS
    正确设置为4,
    OMP\u THREAD\u LIMIT
    为空。t_壁时间远低于t_过程。但如果我设置
    OMP\u THREAD\u LIMIT=1
    OMP\u NUM\u THREADS=1
    ,或者如果我使用一个根本不使用任何并行线程的线性解算器(即MA27),情况也是如此。