Re: UPC shared pointers on SGI/IA64

From: Dan Bonachea (bonachea_at_cs_dot_berkeley_dot_edu)
Date: Fri Apr 07 2006 - 16:47:47 PDT

  • Next message: Jason Beech-Brandt: "Re: UPC shared pointers on SGI/IA64"
    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: "Re: UPC shared pointers on SGI/IA64"