-------- 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]);
		}	
	}
}

Reply via email to