From: Dan Bonachea (bonachea_at_cs_dot_berkeley_dot_edu)
Date: Tue Jun 13 2006 - 15:44:47 PDT
At 10:43 AM 6/13/2006, Konstantin Kleisouris wrote: >Hi, > > I am interested in defining a table dynamically in UPC. >This table should have affinity to Thread 0. I would like >to define an array like data1 below. >shared [] int data1[10][2]; > > The way I did it is as follows: >shared [] int * shared [] * shared data2; > >if (MYTHREAD == 0) { > data2 = (shared [] int * shared [] *) upc_alloc(10 * >sizeof(int *)); the line above has a bug - it should be sizeof(shared [] int *), which is often different from sizeof(int *). BTW - for such complicated ptr-to-shared expressions, it often makes it easier to read if you define some typedefs, eg: typedef shared [] int *tablerow; tablerow shared [] * shared data2; However, this table is a discontiguous pointer-based table, so it will be less efficient than the fully contiguous data1 defined above, and also will not be compatible with library calls like upc_all_gather. You can get a contiguous layout with something like: shared [] int (* shared a)[10][2]; ... if (MYTHREAD == 0) { shared [] int * p = upc_alloc(sizeof(int)*10*2); a = (shared [] int(*)[10][2])p; } ...(*a)[i][j]... Dan > > for(i = 0; i < 10; i++) { > data2[i] = (shared [] int *) upc_alloc(2 * sizeof(int)); > } >} > > >Howevever when I use data1 in a gather it works fine > upc_all_gather(data1, data, sizeof(int)*4, >UPC_IN_ALLSYNC|UPC_OUT_ALLSYNC); > >Imagine that data in the gather above is defined as >shared [2] int data[10][2]; > > >But when I use data2 in the same gather as bellow > upc_all_gather(data2, data, sizeof(int)*4, >UPC_IN_ALLSYNC|UPC_OUT_ALLSYNC); > >I get the following message: >UPC Runtime error: Attempt to use a bogus >upcr_pshared_ptr_t: addrfield out of range > <pshared_ptr: addr=0xe2fed004 (offset=0x4), thread=0, >phase=0> > at /UPC_DEBUG//include/upcr_sptr.h:1245 > >Any idea? > >Kosta