-------- Forwarded Message --------
From: "Sierra Ansuas, Juan Pablo" <[email protected]>
To: [email protected] <[email protected]>
Cc: [email protected] <[email protected]>, "Di Cristofaro, Milton Nadir" <MDiCristo
[email protected]>
Subject: Possible bug in GLPK - Error detected in file env/alloc.c at
line 72
Date: Wed, 25 Mar 2020 18:34:56 +0000
> Dear GLPK mantainer(s),
>
> I am having problems when trying to run the GLPK solver in a multi-
> threaded fashion using its C API and OpenMP. While the solver does
> appear to work, an error comes up when trying to free the memory with
> glp_delete_prob:
>
> glp_free: memory allocation error
> Error detected in file env/alloc.c at line 72
>
> I am no GLPK expert but I would be very grateful if you could check
> the provided source code and determine whether this is being caused
> by a bug or a simple beginner mistake.
>
> Running on an eight core processor, 8GiB ram. Stack size limit: 2GB
> (ulimit -s 2000000), Stack size limit per thread: 200MB (export
> OMP_STACKSIZE=200000). Provided source makes little sense but is
> quite short and reproduces the problem every time. Compile command is
> as follows:
>
> gcc test_c.c -o test_c -fopenmp -I/home/user/libglpk/glpk-
> 4.65/include /home/user/libglpk/glpk-4.65/src/.libs/libglpk.so.40.3.0
>
>
> Regards,
>
> Juan Pablo Sierra
> Desarrollo y Mantenimiento de Modelos
> DCU – Melilla – Montevideo
> Tel. (+598 2) 155 Int. 3777
>
>
> La información contenida en este mensaje y en cualquier archivo
> adjunto, es confidencial y está dirigido únicamente al destinatario
> del mensaje. Si Ud. no es el destinatario correcto por favor
> notifique al remitente respondiendo este mensaje y elimine
> inmediatamente de su sistema el e-mail y los posibles archivos
> adjuntos. Está prohibida cualquier utilización, difusión o copia de
> este e-mail por cualquier persona o entidad que no sean las
> especificas destinatarias del mensaje. UTE no acepta ninguna
> responsabilidad con respecto a cualquier comunicación que haya sido
> emitida incumpliendo nuestra Política de Seguridad de la Información,
> así como lo previsto en la Ley 18.331 de Protección de Datos
> Personales y Ley 18381 de Acceso a la Información Pública
#include <omp.h>
#include <glpk.h>
glp_prob * ejecutar_modelo(){
/* declare variables */
glp_prob *lp;
int ia[1+5], ja[1+5];
double ar[1+5], z, x1, x2;
/* create problem */
lp = glp_create_prob();
glp_set_prob_name(lp, "short");
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);
return lp;
}
int main(){
int maxThreads = omp_get_max_threads();
glp_prob * probs[maxThreads];
for(int i = 0; i < maxThreads; i++)probs[i] = NULL;
int z1;
glp_term_out(0);
for(int i = 0; i < maxThreads; i++){
probs[i] = ejecutar_modelo();
}
glp_term_out(0);
#pragma omp parallel for private(z1) default(none) shared(probs,maxThreads)
for(z1 = 0; z1< maxThreads;z1++){
int i = omp_get_thread_num();
glp_simplex(probs[i],NULL);
}
for(int i = maxThreads-1; i >=0; i--){
if(probs[i] != NULL){
glp_delete_prob(probs[i]);
}
}
}