1
1
openmpi/examples/ring_oshmem_c.c
Mike Dubman 04b134eace 1. Default target (e.g. 'make all') now build all avaliable examples depends on configuration.
2. Oshmem examples moved to 'mpi' build target.
3. Oshmem examples renamed as 'shmem' => 'oshmem'.
4. Fixed warnings in oshmem_info.


Refs: 3763

This commit was SVN r29663.
2013-11-12 13:02:07 +00:00

61 строка
1.5 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);
}
else {
message = rbuf;
}
shmem_int_put(&rbuf, &message, 1, next);
}
/* All done */
printf("Process %d exiting\n", proc);
return 0;
}