我正在尝试转换使用 Fico Xpress 求解器的单线程应用程序,使其与 OpenMP 同时解决多个问题。我使用的许可方法仅限于 1 个进程,因此理论上多线程程序应该可以工作。
对于每个线程,我需要该程序:
- 执行模型
- 提取问题
- 解决这个问题
但是,我不断收到类似以下的段错误和错误:
Mosel: E-84: File `mem:0x7f5c9a0ca640/2000/0x7f5c9a0ca5c0': model cannot be renamed.
Mosel: E-83: Bim file `mem:0x7f5c9a0ca640/2000/0x7f5c9a0ca5c0' cannot be loaded.
例如,我采用了这个示例代码。
- 运行它没有任何修改,它的工作原理。
- 添加一个
for(int i = 0; i < 100; i++)
,它可以工作,单线程。 - 并行化使用
#pragma omp parallel for
,出现“模型无法重命名”错误。 #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 搜索有一定的支持,但我对并发单线程搜索感兴趣。