From: Venelin Mitov (vmitov_at_gmail_dot_com)
Date: Mon Jan 03 2005 - 11:31:44 PST
Hello again,
By specification the upc_alloc function allocates memory with affinity
to the calling thread, but the following example denies it:
#include <upc_relaxed.h>
#include <stdio.h>
#define N (2*THREADS)
#define MODE_ELLIPSE 0
#define MODE_RECTANGLE 1
typedef struct {
int X, Y;
} Point;
typedef struct {
shared[] Point * pts;
int leftest;
int end;
} Hull;
void hullcpy(shared Hull* dst, shared Hull* src){
int i;
dst->pts = (shared[] Point *)upc_alloc(src->end*sizeof(Point));
printf("t%d:hullcpy thread of dst->pts=%d\n", MYTHREAD,
upc_threadof(dst->pts));
upc_memcpy(dst->pts, src->pts, src->end*sizeof(Point));
dst->end = src->end;
dst->leftest = src->leftest;
}
shared[N/THREADS] Hull hulls[N];
/*********************************** MAIN ***********************************/
int main(){
hulls[MYTHREAD*2].pts = (shared[] Point *)upc_alloc(N*sizeof(Point));
hulls[MYTHREAD*2].pts[0].X = 0;
hulls[MYTHREAD*2].pts[0].Y = 1;
hulls[MYTHREAD*2].pts[1].X = 2;
hulls[MYTHREAD*2].pts[1].Y = 3;
hulls[MYTHREAD*2].pts[2].X = 4;
hulls[MYTHREAD*2].pts[2].Y = 5;
hulls[MYTHREAD*2].pts[3].X = 6;
hulls[MYTHREAD*2].pts[3].Y = 7;
upc_barrier;
printf("hulls[0].pts:%d\n", upc_threadof(hulls[0].pts));
printf("hulls[2].pts:%d\n", upc_threadof(hulls[2].pts));
if(MYTHREAD == 1)
hullcpy((shared Hull*)(&hulls[1]), (shared Hull*)(&hulls[2]));
else
hullcpy((shared Hull*)(&hulls[3]), (shared Hull*)(&hulls[0]));
upc_barrier;
printf("hulls[1].pts:%d\n", upc_threadof(hulls[1].pts));
printf("hulls[3].pts:%d\n", upc_threadof(hulls[3].pts));
return 0;
}
The program was compiled with "upcc -T 2 -o point point.c"
Here is the output:
UPCR: UPC thread 0 of 2 on hpc-n06 (process 0 of 2, pid=15887)
UPCR: UPC thread 1 of 2 on hpc-n04 (process 1 of 2, pid=13776)
hulls[0].pts:0
hulls[2].pts:1
t1:hullcpy thread of dst->pts=0 //!!!! I think it should be thread 1 here
hulls[1].pts:0 //!!!! 1
hulls[0].pts:0
hulls[2].pts:1
t0:hullcpy thread of dst->pts=0
hulls[1].pts:0 //!!!! 1
hulls[3].pts:0
hulls[3].pts:0
TID HOST_NAME COMMAND_LINE STATUS TERMINATION_TIME
==== ========== ================ ======================= ===================
0001 hpc-n06 mpirun --gm-kill Done 01/03/2005 20:20:57
0002 hpc-n04 mpirun --gm-kill Done 01/03/2005 20:20:57
It seems that only the call to upc_alloc in the main function has
allocated memory
with the correct affinity.