From: Dan Bonachea (bonachea_at_cs_dot_berkeley_dot_edu)
Date: Fri Apr 07 2006 - 16:47:47 PDT
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); >}