1
1
openmpi/examples/ring_oshmem_c.c
Alex Margolin ce97fc7674 OSHMEM: Fixed race condition problem in example code.
The problem was with oshmem ring code, which cycles a constant amout of data through all the processes.
When the program would expect the memory to change it did not explicitly warrent a recv() call, thus
counting on the memory region to hold the new value when in fact it could be set before or after the
check, causing slower BTLs to pass and faster ones to fail. The fix changes the logic to anticipate
the next message rather then the current one, which would be a mistake.
Patch applied to both C and fortran90 version of the example code.

reviewd by miked

cmr=v1.7.5:reviewer=ompi-rm1.7

This commit was SVN r30760.
2014-02-18 13:00:53 +00:00

61 строка
1.6 KiB
C

/*
* Copyright (c) 2013 Mellanox Technologies, Inc.
* All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include <shmem.h>
#include <stdio.h>
int main (int argc, char * argv[])
{
static int rbuf = -1;
int proc, nproc, next, prev;
int message = 10;
start_pes(0);
proc = _my_pe();
nproc = _num_pes();
/* Calculate the PE number of the next process in the ring. Use the
modulus operator so that the last process "wraps around" to PE 0. */
next = (proc + 1) % nproc;
if(proc == 0)
{
printf("Process 0 puts message %d to %d (%d processes in ring)\n", message, next, nproc);
shmem_int_put(&rbuf, &message, 1, next);
}
/* Pass the message around the ring. The exit mechanism works as
follows: the message (a positive integer) is passed around the
ring. Each time it passes PE 0, it is decremented. When each
processes receives a message containing a 0 value, it passes the
message on to the next process and then quits. By passing the 0
message first, every process gets the 0 message and can quit
normally. */
while(message > 0) {
shmem_int_wait_until(&rbuf, SHMEM_CMP_EQ, message);
if(proc == 0) {
--message;
printf("Process 0 decremented value: %d\n", message);
}
shmem_int_put(&rbuf, &message, 1, next);
if(proc != 0) {
--message;
}
}
/* All done */
printf("Process %d exiting\n", proc);
return 0;
}