0

parallel_for ループで GLPK の LP ソルバーを実行したいと考えています。問題はすべて互いに独立しているため、干渉があってはなりません。

失敗するサンプル コードを次に示します。これは基本的に glpk wikibook のサンプル コードですが、parallel_for ループでラップされています。どんな助けでも大歓迎です

//#include <stdio.h>            /* C input/output                       */
//#include <stdlib.h>           /* C standard library                   */
#include <iostream>
#include <glpk.h>             /* GNU GLPK linear/mixed integer solver */
#include <ppl.h>

using namespace concurrency;
using namespace std;

void main()
{
    parallel_for(0, 10, [](int i){
        /* declare variables */
        glp_prob *lp;
    int *ia = new int[4];
    int *ja = new int[4];
    double *ar = new double[4];
    double z, x1, x2;


    /* create problem */
    lp = glp_create_prob();
    glp_set_prob_name(lp, "minimax");
    glp_set_obj_dir(lp, GLP_MAX);


    /* fill problem */
    glp_add_rows(lp, 2);
    //glp_set_row_name(lp, 1, "p");
    glp_set_row_bnds(lp, 1, GLP_UP, 0.0, 1.0);
    //glp_set_row_name(lp, 2, "q");
    glp_set_row_bnds(lp, 2, GLP_UP, 0.0, 2.0);


    glp_add_cols(lp, 2);
    //glp_set_col_name(lp, 1, "x1");
    glp_set_col_bnds(lp, 1, GLP_LO, 0.0, 0.0);
    glp_set_obj_coef(lp, 1, 0.6);
    //glp_set_col_name(lp, 2, "x2");
    glp_set_col_bnds(lp, 2, GLP_LO, 0.0, 0.0);
    glp_set_obj_coef(lp, 2, 0.5);


    ia[1] = 1, ja[1] = 1, ar[1] = 1.0; /* a[1,1] = 1 */
    ia[2] = 1, ja[2] = 2, ar[2] = 2.0; /* a[1,2] = 2 */
    ia[3] = 2, ja[3] = 1, ar[3] = 3.0; /* a[2,1] = 3 */
    ia[4] = 2, ja[4] = 2, ar[4] = 1.0; /* a[2,2] = 1 */
    glp_load_matrix(lp, 4, ia, ja, ar);



    /* solve problem */
    glp_simplex(lp, NULL);
    /* recover and display results */
    z = glp_get_obj_val(lp);
    x1 = glp_get_col_prim(lp, 1);
    x2 = glp_get_col_prim(lp, 2);
    printf("z = %g; x1 = %g; x2 = %g\n", z, x1, x2);
    /* housekeeping */
    glp_delete_prob(lp);
    glp_free_env();
});
    system("pause");
}
4

2 に答える 2

1

問題が見つかりました。問題は GLPK ソース コードにあり、いくつかの大きな問題を引き起こしている再入不可のルーチンがいくつかあります。これはここに文書化されています: http://en.wikibooks.org/wiki/GLPK/Using_the_GLPK_callable_library。修正も行われていますが、再構築が必要です。これは GLPK のバージョン 4.50 でのみ機能することに注意してください。これより古いバージョンではレイアウトが少し異なります。

Ben は完全に正しかったのですが、ライブラリにこの変更を加えることですべての問題が解決し、ループ内の環境を解放できます。

于 2013-12-04T19:33:29.900 に答える
1

glp_free_envライブラリが他のスレッドでアクティブに作業を行っている間に、各スレッド内から呼び出しています。それはうまくいきません-あなたは一生懸命働いている糸の下からじゅうたんを引っ張っています..

代わりに、すべてのスレッドが計算を完了した (結合する) 後にのみ呼び出します。この単純な例では、おそらくクリーンアップ手順を完全にスキップできます。

于 2013-12-02T19:47:05.510 に答える