【问题标题】:Solving several problems concurrently with multithreaded application and XPRESS solver使用多线程应用程序和 XPRESS 求解器同时解决多个问题
【发布时间】:2022-01-11 15:11:58
【问题描述】:

我正在尝试转换使用 Fico Xpress 求解器的单线程应用程序,使其与 OpenMP 同时解决多个问题。我使用的许可方法仅限于 1 个进程,因此理论上多线程程序应该可以工作。

对于每个线程,我需要程序:

  1. 执行模型
  2. 提取问题
  3. 解决问题

但是,我不断收到类似以下的段错误和错误:

Mosel: E-84: File `mem:0x7f5c9a0ca640/2000/0x7f5c9a0ca5c0': model cannot be renamed.
Mosel: E-83: Bim file `mem:0x7f5c9a0ca640/2000/0x7f5c9a0ca5c0' cannot be loaded.

比如我拿了this sample code

  1. 无需任何修改即可运行它。
  2. 添加一个for(int i = 0; i < 100; i++),它可以工作,单线程。
  3. 使用#pragma omp parallel for进行并行化,出现“模型无法重命名”错误。
  4. parallel for(用于测试目的)中添加#pragma omp critical,如下所示,它可以工作。
    int main(){
        #pragma omp parallel for
        for (int i = 0; i < 100; i++){
        #pragma omp critical
           {
         ... variables and code ...
           } // end critical
        } // end for
    }

在使它们成为多线程后,我无法让任何样本工作,因此这似乎是求解器、许可证或我使用它的方式的限制。我正在使用加密狗许可证。

我知道 Xpress 对单个问题的多线程 MIP 搜索有一定的支持,但我对并发单线程搜索感兴趣。

【问题讨论】:

  • 你能说明一下你在这个循环中到底在做什么吗?您将点链接到 Mosel 模型。由此不清楚你在循环中做了什么。

标签: c multithreading openmp mosel xpress-optimizer


【解决方案1】:

我怀疑这与here 讨论的问题相同。在那次讨论中,结果证明XPRMloadmod() 在循环中被用于加载每次迭代模型。该函数被调用时使用了错误的参数,导致不同的模型具有相同的名称,因此重命名模型时出错。

为了实现这一点,必须使用内部名称"*" 调用XPRMloadmod(),请参阅参考文档here

代码应如下所示(为简洁起见,省略了错误检查):

XPRMinit();
#pragma omp parallel for
for (int k = 0; k < 20; k++){
  XPRMmodel mod;
  int result;
  mod=XPRMloadmod("burglar4.bim", "*");
  XPRMrunmod(mod, &result, NULL);
}

然后当然要在代码中添加错误检查,这样您就不会最终使用未正确加载的模型等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多