Re: UPC shared pointers on SGI/IA64

From: Jason Beech-Brandt (jason_at_ahpcrc_dot_org)
Date: Mon Apr 10 2006 - 09:54:43 PDT

  • Next message: Jason Beech-Brandt: "symmetric shared pointers"
    The fix seems to have done the trick.  Thanks for the help.
    
    Jason
    
    Dan Bonachea wrote:
    > I've confirmed this is a compiler bug. I've entered it as bug 1557:
    >
    > http://upc-bugs.lbl.gov/bugzilla/show_bug.cgi?id=1557
    >
    > Dan
    > At 02:18 PM 4/7/2006, Jason Beech-Brandt wrote:
    >> Hi,
    >>
    >> I'm having some trouble with Berkeley upc-2.2.2 on an SGI Altix/IA64.
    >> I'm using the remote translator and Intel 9.0 compilers for the 
    >> backend.  I've attached a short UPC program, upc_test.upc, which 
    >> contains an array of shared pointers to "Node" data structures.  When 
    >> I access this data through a private pointer I get some unexpected 
    >> results.
    >>
    >> Executing...
    >> upcrun -n 4 ./upc_test
    >>
    >> Thread 0 has nodes[0].x[0] equal to 0.000
    >> Thread 0 has nodes[1].x[0] equal to 0.000
    >> Thread 0 has nodes[2].x[0] equal to 0.000
    >> Thread 0 has nodes[3].x[0] equal to 0.000
    >> Thread 0 has nodes[4].x[0] equal to 0.000
    >> Thread 1 has nodes[0].x[0] equal to 1.000
    >> Thread 1 has nodes[1].x[0] equal to 0.000
    >> Thread 1 has nodes[2].x[0] equal to 0.000
    >> Thread 1 has nodes[3].x[0] equal to 0.000
    >> Thread 1 has nodes[4].x[0] equal to 0.000
    >> Thread 2 has nodes[0].x[0] equal to 2.000
    >> Thread 2 has nodes[1].x[0] equal to 0.000
    >> Thread 2 has nodes[2].x[0] equal to 0.000
    >> Thread 2 has nodes[3].x[0] equal to 0.000
    >> Thread 2 has nodes[4].x[0] equal to 0.000
    >> Thread 3 has nodes[0].x[0] equal to 3.000
    >> Thread 3 has nodes[1].x[0] equal to 0.000
    >> Thread 3 has nodes[2].x[0] equal to 0.000
    >> Thread 3 has nodes[3].x[0] equal to 0.000
    >> Thread 3 has nodes[4].x[0] equal to 0.000
    >>
    >> which I believe is incorrect.  I believe it should output
    >>
    >> Thread 0 has nodes[0].x[0] equal to 0.000
    >> Thread 0 has nodes[1].x[0] equal to 0.000
    >> Thread 0 has nodes[2].x[0] equal to 0.000
    >> Thread 0 has nodes[3].x[0] equal to 0.000
    >> Thread 0 has nodes[4].x[0] equal to 0.000
    >> Thread 1 has nodes[0].x[0] equal to 1.000
    >> Thread 1 has nodes[1].x[0] equal to 1.000
    >> Thread 1 has nodes[2].x[0] equal to 1.000
    >> Thread 1 has nodes[3].x[0] equal to 1.000
    >> Thread 1 has nodes[4].x[0] equal to 1.000
    >> Thread 2 has nodes[0].x[0] equal to 2.000
    >> Thread 2 has nodes[1].x[0] equal to 2.000
    >> Thread 2 has nodes[2].x[0] equal to 2.000
    >> Thread 2 has nodes[3].x[0] equal to 2.000
    >> Thread 2 has nodes[4].x[0] equal to 2.000
    >> Thread 3 has nodes[0].x[0] equal to 3.000
    >> Thread 3 has nodes[1].x[0] equal to 3.000
    >> Thread 3 has nodes[2].x[0] equal to 3.000
    >> Thread 3 has nodes[3].x[0] equal to 3.000
    >> Thread 3 has nodes[4].x[0] equal to 3.000
    >>
    >> which is what the gcc-upc-3.4.4 compiler gives on the same machine 
    >> (along with cray-cc on the X1).  If I remove the structure element of 
    >> the code, and simply use an array, everything is fine.  Likewise, if 
    >> I remove the array element from the structure, leaving a structure 
    >> containing only a double, I get what I expect.
    >>
    >> I'm not sure what's going on here, or even exactly where the problem 
    >> is, but any input is appreciated.
    >>
    >> Thanks,
    >>
    >> Jason
    >>
    >>
    >> #include <stdio.h>
    >> #include <upc.h>
    >> #define MAXP 10
    >> #define NUME 5
    >>
    >> typedef struct Node_rec {
    >>    double x[3];
    >> } Node;
    >>
    >> shared [] Node *nodesSH[MAXP];
    >> Node *nodes;
    >> shared [] Node *shared nodesTMP[THREADS];
    >>
    >> int main(void){
    >>
    >>    int ip,i;
    >>
    >>    nodesSH[MYTHREAD] = (shared [] Node *) upc_alloc(NUME * 
    >> sizeof(Node));
    >>
    >>    nodes = (Node *) nodesSH[MYTHREAD];
    >>
    >>    upc_barrier;
    >>    nodesTMP[MYTHREAD] = nodesSH[MYTHREAD];
    >>    upc_barrier;
    >>    for (ip = 0; ip < THREADS; ip++)
    >>       if (ip != MYTHREAD)
    >>          nodesSH[ip] = nodesTMP[ip];
    >>    upc_barrier;
    >>    if (MYTHREAD == 0){
    >>       for (ip = 0; ip < THREADS; ip++)
    >>          for (i = 0; i < NUME; i++){
    >>             nodesSH[ip][i].x[0] = 1.0 * ip;
    >>             nodesSH[ip][i].x[1] = 2.0 * ip;
    >>             nodesSH[ip][i].x[2] = 3.0 * ip;
    >>          }
    >>    }
    >>    upc_barrier;
    >>    for (ip = 0; ip < THREADS; ip++){
    >>       upc_barrier;
    >>       if ( ip == MYTHREAD)
    >>          for (i = 0; i < NUME; i++)
    >>             printf("Thread %d has nodes[%d].x[0] equal to %4.3f\n", 
    >> MYTHREAD,i,nodes[i].x[0]);
    >>    }
    >>    upc_barrier;
    >>    upc_free(nodesSH[MYTHREAD]);
    >>    upc_global_exit(0);
    >> }
    >
    

  • Next message: Jason Beech-Brandt: "symmetric shared pointers"