From: Dan Bonachea (bonachea_at_cs_dot_berkeley_dot_edu)
Date: Tue Jan 18 2005 - 15:37:48 PST
The UPC spec prohibits nesting of barrier statements - after a thread executes
upc_notify, the next collective operation it invokes must be upc_wait.
As a debugging aid, Berkeley UPC attempts to issue an error message (at least
in debug mode) if you attempt to do this erroneous behavior. It generally
looks something like this:
Hello1 from thread 1 of 2
Hello1 from thread 0 of 2
UPC Runtime error: misordered call to barrier notify
UPC Runtime error: misordered call to barrier notify
or this:
Hello1 from thread 0 of 1
*** GASNet FATAL ERROR: gasnet_barrier_notify() called twice in a row
*** Caught a fatal signal: SIGABRT(6) on node 0/1
I'm not sure why you didn't see that error - perhaps your batch system lost
stderr?
Dan
At 01:18 PM 1/18/2005, Venelin Mitov wrote:
>Hi,
>
>Can we nest upc_notify statements? I tried the following example with 4
>threads.
>Only the Hello0 message was printed by each thread which means that
>all threads fail when trying to execute the second upc_notify
>(upc_notify 2; for threads < 2 and upc_notify 1; for threads >= 2).
>
>#include <upc_relaxed.h>
>#include <stdio.h>
>
>shared int A[THREADS];
>
>int main(int argc, char *argv[])
>{
> int i;
>
> if(MYTHREAD < 2)
> upc_notify 1;
> else
> upc_notify 2;
>
> A[THREADS - MYTHREAD - 1] = THREADS - MYTHREAD - 1;
>
> printf("Hello1 from thread %d of %d\n", MYTHREAD, THREADS);
>
> if(MYTHREAD < 2){
> upc_notify 2;
> printf("Hello2 from thread %d of %d\n", MYTHREAD, THREADS);
> // upc_wait 1;
> upc_wait 2;
> printf("Hello3 from thread %d of %d\n", MYTHREAD, THREADS);
> }
> else{
> upc_notify 1;
> printf("Hello2 from thread %d of %d\n", MYTHREAD, THREADS);
> // upc_wait 2;
> upc_wait 1;
> printf("Hello3 from thread %d of %d\n", MYTHREAD, THREADS);
> }
> if(MYTHREAD == 0)
> for(i = 0; i < THREADS; i++)
> printf("%d", A[i]);
> if(MYTHREAD < 2)
> upc_wait 1;
> else
> upc_wait 2;
>}
>
>Here is the output I receive when running the example:
>
>------------------------------------------------------------
># LSBATCH: User input
>upcjob gasnetrun_gm -np 4 hello
>------------------------------------------------------------
>
>Exited with exit code 6.
>
>Resource usage summary:
>
> CPU time : 0.84 sec.
> Max Memory : 5 MB
> Max Swap : 9 MB
>
> Max Processes : 1
>
>The output (if any) follows:
>
>UPCR: UPC thread 0 of 4 on hpc-n21 (process 0 of 4, pid=30095)
>UPCR: UPC thread 3 of 4 on hpc-n09 (process 3 of 4, pid=19017)
>UPCR: UPC thread 2 of 4 on hpc-n08 (process 2 of 4, pid=15463)
>UPCR: UPC thread 1 of 4 on hpc-n06 (process 1 of 4, pid=3483)
>Hello from thread 0 of 4
>Hello from thread 1 of 4
>Hello from thread 2 of 4
>Hello from thread 3 of 4
>
>TID HOST_NAME COMMAND_LINE STATUS TERMINATION_TIME
>==== ==========
>================ ======================= ===================
>0001 hpc-n06 gasnetrun_gm --g Killed by PAM (SIGTERM) 01/18/2005
>21:47:30
>0002 hpc-n21 gasnetrun_gm --g Killed by PAM (SIGTERM) 01/18/2005
>21:47:30
>0003 hpc-n08 gasnetrun_gm --g Signaled (SIGIOT) 01/18/2005
>21:47:30
>0004 hpc-n09 gasnetrun_gm --g Killed by PAM (SIGTERM) 01/18/2005
>21:47:30
>
>Thank you!
>
>Venelin