1

我正在尝试转换使用 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.

例如,我采用了这个示例代码

  1. 运行它没有任何修改,它的工作原理。
  2. 添加一个for(int i = 0; i < 100; i++),它可以工作,单线程。
  3. 并行化使用#pragma omp parallel for,出现“模型无法重命名”错误。
  4. #pragma omp critical在里面添加一个parallel for(用于测试目的),如下所示,它可以工作。
    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 搜索有一定的支持,但我对并发单线程搜索感兴趣。

4

1 回答 1

0

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

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

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

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

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

于 2021-12-07T11:03:29.143 回答