【发布时间】:2022-01-11 15:11:58
【问题描述】:
我正在尝试转换使用 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.
比如我拿了this sample code。
- 无需任何修改即可运行它。
- 添加一个
for(int i = 0; i < 100; i++),它可以工作,单线程。 - 使用
#pragma omp parallel for进行并行化,出现“模型无法重命名”错误。 - 在
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