That's nice. It worked well. There is another question. I have added the 
balancing of (computational) loads on each cores as well. I have seen the 
following model solves (with given data) and processes are bound to the cores 
with perfect balance of loads and communication cost. See the objective 
function, I have added z with commcost to balance both. But if commcost has a 
bigger value as compared to z then commcost will diminish the effect of z and 
only balance of communication will be done. I need to bring commcost and z to 
the same scale such that balance of both is done. Here is the updated code.

regards,
Mudassar


/* The set of processes that will execute on different cores */

set Processes;

/* Total number of cores */

param p;

/* Number of cores per node */

param k;

/* The communication cost between processes with ranks i and j */

param comm{i in Processes, j in Processes};

/* Weight communicating across the nodes between two processes */

param b_across_nodes;

/* Weight communicating within a node between two processes */

param b_within_node;

/* Load on the process with rank i */

param load{i in Processes};

/* x is a binary variable that shows where process pi resides on core ki of 
node ni */
/* If there are p cores and k cores per node then the number of nodes will be 
ceil(p/k) */

var x{pi in Processes, ni in 1..ceil(p/k), ki in 1..k}, binary;
var comcost{pi in Processes, pj in Processes : pi > pj}, >= b_within_node;

var z;

s.t. load_on_each_core{ni in 1..ceil(p/k), ki in 1..k}: z >= sum{pi in 
Processes} x[pi, ni, ki] * load[pi];

s.t. comm_cost{pi in Processes, pj in Processes, ni in 1..ceil(p/k), nj in 
1..ceil(p/k) : (pi > pj) and (ni != nj)}:
  comcost[pi,pj] >= (comm[pj,pi]+comm[pi,pj])*(b_within_node + 
(b_across_nodes-b_within_node)*(sum{ki in 1..k} x[pi,ni,ki] + sum{kj in 1..k} 
x[pj,nj,kj] - 1));

minimize timespan: z + sum{pi in Processes, pj in Processes: pi > pj} 
comcost[pi,pj]; 

s.t. mapped{pi in Processes}: sum{ni in 1..ceil(p/k), ki in 1..k} x[pi, ni, ki] 
= 1;

data;

set Processes := 1 2 3 4 5 6 7 8 9 10 11 12;

param p := 6;

param k := 2;

param load [1] 4 [2] 5 [3] 3 [4] 8 [5] 7 [6] 4 [7] 2 [8] 2 [9] 6 [10] 9 [11] 1 
[12] 1;

param comm:   1 2 3 4 5 6 7 8 9 10 11 12 :=
        1 0 0 0 0 0 0 0 2 0 0 0 0  
        2 0 0 0 0 0 0 0 0 7 0 0 0 
        3 0 0 0 0 6 0 0 0 0 0 9 0 
        4 0 0 0 0 0 0 0 0 0 5 0 0 
        5 0 0 6 0 0 0 0 0 0 0 0 0 
        6 0 0 0 0 0 0 0 0 0 0 0 1 
        7 0 0 0 0 0 0 0 0 0 0 0 0 
        8 7 0 0 0 0 0 0 0 0 0 0 0 
        9 0 7 0 0 0 0 0 0 0 0 0 0 
       10 0 0 0 8 0 0 0 0 0 0 0 0 
       11 0 0 5 0 0 0 0 0 0 0 0 0
       12 0 0 0 0 0 3 0 0 0 0 0 0;

param b_across_nodes := 10;
param b_within_node := 3;

end;

 
Life is the name of establishing a clear balance between hard work and praying 
to God for success. The one who could find out and order the major milestones 
of life in a proper way and acted upon them is successful. Faith in, and 
obedience to Allah, one's values, contribution for (nation, family & human 
beings), career, earning, extra activities and hobbies.... The best ordered 
list of milestones of life...!!!



________________________________
From: Xypron <[email protected]>
To: Mudassar Majeed <[email protected]>
Cc: "[email protected]" <[email protected]>
Sent: Friday, October 21, 2011 9:49 PM
Subject: Re: I need help to convert quadratic problem into linear


Hello Mudassar,

to determine the cost of communication between two processes
    probably you are looking for something like:

var x{pi in Processes, ni in 1..ceil(p/k), ki in 1..k}, binary;
var comcost{pi in Processes, pj in Processes : pj > pj}, >=
      b_inside_nodes;

s.t. constraint{pi in Processes, pj in Processes, ni in
      1..ceil(p/k), nj in 1..ceil(p/k) : pj > pj, ni != nj} :
  comcost[pi,pj] >= (comm[pj,pi]+comm[pi,pj]) 
    * (b_inside_nodes 
    + (b_across_nodes-b_inside_nodes) 
    * ( sum{ki in 1..k} x[pi,ni,ki] + sum{kj in 1..k} x[pj,nj,kj]
      - 1 ));

minimize sum{pi in Processes, pj in Processes : pj > pj}
      comcost[pi,pj];

Best regards

Xypron

On 21.10.2011 18:41, Mudassar Majeed wrote: 
Dear All,
>                 I am trying to solve a problem using ILP and
        have some problem. If some genius can help me out, I will be
        very thankful. I am using glpsol to solve it. Following is the
        code and the explanation.
>I have p cores and k cores per node, where number of nodes are
        ceil(p/k). I have some processes, where card(Processes) > p.
        Every process i communicates with some other processes (more
        than one), such that comm[i,j] gives how much 
>communication i performs with j (Communication that j performs
        with i is in comm[j,i]). Now as I said there are ceil(p/k) nodes
        each having k cores, a core will have more than one processes
        mapped to it. Secondly any two processes 
>that communicate with each other and that are mapped to some
        cores in the same node have a weight assigned to each
        communication b_within_node. Similarly for two processes mapped
        to two separates cores on different nodes will have 
>costly communication given as a weight in b_across_nodes. The
        objective is to assign the processes to cores (in nodes) such
        that the overall communication cost is minimum. I have defined a
        variable x{pi in Processes, ni in 1...ceil(p/k), ki in 1..k},
        binary. 
>if x[pi, ni, ki] = 1 then it means process pi is assigned to
        core ki of node ni. I have used another variable z that shows
        the communication cost of process pi (that process pi sends to
        others) and then tried to minimize the maximum cost a process
        can have. In 
>this way, it will provide me such solution in x (the mappings of
        processes to cores) such that communication will be balanced,
        that means those processes that communicate more will come on
        the same node etc. 
>
>I have written the code, now I have reached to a problem where
        it becomes quadratic (see the first constraint). If somebody
        understands my problem then suggest me how can I convert this
        constraint into linear, as the solver warns me of multiplication
        of linear variables is 
>not allowed. 
>
>Code is as follows. Please help me in it. Thanks in Advance.
>
>best regards,
>Mudassar Majeed.
>
>
>/*----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
>/* The set of processes that will execute on different cores */
>
>set Processes;
>
>/* Total number of cores */
>
>param p;
>
>/* Number of cores per node */
>
>param k;
>
>/* The communication cost between processes with ranks i and j
        */
>
>param comm{i in Processes, j in Processes};
>
>/* Weight communicating across the nodes between two processes
        */
>
>param b_across_nodes;
>
>/* Weight communicating within a node between two processes */
>
>param b_within_node;
>
>/* x is a binary variable that shows where process pi resides on
        core ki of node ni */
>/* If there are p cores and k cores per node then the number of
        nodes will be ceil(p/k) */
>
>var x{pi in Processes, ni in 1..ceil(p/k), ki in 1..k}, binary;
>
>var z; 
>
>s.t. comm_from_each_proc{pi in Processes}: z >= sum{ni in
        1..ceil(p/k), ki in 1..k} x[pi,ni,ki] * 
>                        (sum{qi in Processes, nq in
        1..ceil(p/k), kq in 1..k: (pi != qi)}x[qi,nq,kq]*comm[pi,qi] *
        (if (ni != nq) then b_across_nodes else b_within_node));
>minimize timespan: z;
>
>s.t. mapped{pi in Processes}: sum{ni in 1..ceil(p/k), ki in
        1..k} x[pi, ni, ki] = 1;
>
>data;
>
>set Processes := 1 2 3 4 5 6 7 8 9 10 11 12;
>
>param p := 6;
>
>param k := 2;
>
>param comm:   1 2 3 4 5 6 7 8 9 10 11 12 :=
>        1 0 2 5 6 2 8 5 2 5 6 3 7  
>        2 3 0 3 5 6 4 8 2 7 4 6 2 
>        3 5 4 0 5 7 2 3 2 7 5 9 3 
>        4 2 3 2 0 6 4 6 3 2 5 4 3 
>        5 6 4 6 3 0 5 3 2 6 4 5 2 
>        6 5 3 2 4 2 0 4 3 7 3 4 1 
>        7 7 4 5 6 2 8 0 4 2 2 3 4 
>        8 7 6 5 3 4 6 2 0 1 5 2 4 
>        9 8 7 2 3 1 6 4 6 0 7 5 2 
>       10 5 4 6 8 1 1 2 3 6 0 3 5 
>       11 6 2 5 4 8 3 1 1 4 2 0 4
>       12 4 3 4 1 1 3 4 1 2 4 5 0;
>
>param b_across_nodes := 10;
>param b_within_node := 3;
>  
>end;
>
>/*----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
>
_______________________________________________
Help-glpk mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/help-glpk

Reply via email to