File: ring_oshmem_c.c

package info (click to toggle)
openmpi 2.0.2-2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 99,912 kB
  • ctags: 55,589
  • sloc: ansic: 525,999; f90: 18,307; makefile: 12,062; sh: 6,583; java: 6,278; asm: 3,515; cpp: 2,227; perl: 2,136; python: 1,350; lex: 734; fortran: 52; tcl: 12
file content (65 lines) | stat: -rw-r--r-- 1,746 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
 * Copyright (c) 2014      Mellanox Technologies, Inc.
 *                         All rights reserved.
 * $COPYRIGHT$
 *
 * Additional copyrights may follow
 *
 * $HEADER$
 */

#include <shmem.h>
#include <stdio.h>

#if !defined(OSHMEM_SPEC_VERSION) || OSHMEM_SPEC_VERSION < 10200
#error This application uses API 1.2 and up
#endif

int main (int argc, char * argv[])
{
    static int rbuf = -1;
    int proc, nproc, next;
    int message = 10;

    shmem_init();
    nproc = shmem_n_pes();
    proc = shmem_my_pe();

    /* 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;
        }
    }
    shmem_finalize();

    /* All done */

    printf("Process %d exiting\n", proc);

    return 0;
}