From: Paul H. Hargrove (PHHargrove_at_lbl_dot_gov)
Date: Sun Jan 03 2010 - 00:40:19 PST
Oystein, The following does NOT address your problem, but I believe I see 3 problems in your allocate2DArray function: 1) You need a upc_barrier between the "array[r] = ..." and the return. Otherwise it would be possible for a thread to access A[i][j] before A[i] is initialized. 2) The upc_barrier between the upc_all_alloc and the for loop is unnecessary 3) The for loop + if are a "classic" example of a upc_forall Of these three only #1 is critical to correct code. So, I believe the following is a more correct version (hopefully somebody will correct me it I am mistaken). shared [] int *shared * allocate2DArray(int rows, int columns) { shared [] int *shared * array; int r; array = (shared [] int *shared *)upc_all_alloc(rows, sizeof(shared [] int *shared)); upc_forall (r = 0; r < rows; ++r; &array[r]) { array[r] = (shared [] int *shared)upc_alloc(sizeof(shared int) * columns); } upc_barrier; return array; } -Paul Oystein Thorsen wrote: > Hi, > > I was looking at the code for allocating a shared 2D array (posted on > this email list early December 09) and tried to put it in a function > that returns the pointer to the array, but I get a warning from the > compiler that doesn't make much sense to me: (The program seems to > work fine if I ignore the error though) > > $ upcc test.c > test.c: In function `allocate2DArray': > test.c:26: warning: return from incompatible pointer type > $ > > Here is a simplified version of the code (All in one file): > > #include <upc_relaxed.h> > #include <stdio.h> > > shared [] int *shared * allocate2DArray(int rows, int columns); > > int main() { > shared [] int *shared * data; > > data = allocate2DArray(5, 3); > > return 0; > } > > // Allocate a 2D Array in shared space with a row-wise round-robin > distribution. > shared [] int *shared * allocate2DArray(int rows, int columns) { > shared [] int *shared * array; > int r, c; > > array = (shared [] int *shared *)upc_all_alloc(rows, sizeof(shared > [] int *shared)); > upc_barrier; > for (r = 0; r < rows; ++r) { > if (upc_threadof(&array[r]) == MYTHREAD) { > array[r] = (shared [] int *shared)upc_alloc(sizeof(shared > int) * columns); > } > } > > return array; //<===== Warning points to this line > } > > end of code > > I'm using the Berkeley upcc compiler version 2.10.0 with remote > translation. > > The warning goes away if I move the declaration of allocate2DArray() > to where the prototype is (and remove the prototype). Or if I cast > array to remove the blocking factor on return: > > return (shared int *shared *)array; > > The warning comes back if I do both.... > > Regards, > > Oystein -- Paul H. Hargrove PHHargrove_at_lbl_dot_gov Future Technologies Group Tel: +1-510-495-2352 HPC Research Department Fax: +1-510-486-6900 Lawrence Berkeley National Laboratory