bd8b4f7f1e
Roll in the ORTE state machine. Remove last traces of opal_sos. Remove UTK epoch code. Please see the various emails about the state machine change for details. I'll send something out later with more info on the new arch. This commit was SVN r26242.
135 строки
3.8 KiB
C
135 строки
3.8 KiB
C
#include <stdio.h>
|
|
#include <signal.h>
|
|
|
|
|
|
#include "orte/util/proc_info.h"
|
|
#include "orte/util/name_fns.h"
|
|
#include "orte/runtime/orte_globals.h"
|
|
#include "orte/mca/rml/rml.h"
|
|
|
|
#include "orte/runtime/runtime.h"
|
|
|
|
#define MY_TAG 12345
|
|
#define MAX_COUNT 3
|
|
|
|
# define false 0
|
|
# define true 1
|
|
|
|
int
|
|
main(int argc, char *argv[]){
|
|
int counter = 0;
|
|
char * my_name = NULL;
|
|
char * my_right_peer = NULL;
|
|
char * my_left_peer = NULL;
|
|
orte_process_name_t right_peer_orte_name;
|
|
orte_process_name_t left_peer_orte_name;
|
|
int num_peers = 0;
|
|
struct iovec msg;
|
|
|
|
/*
|
|
* Init
|
|
*/
|
|
orte_init(&argc, &argv, ORTE_PROC_NON_MPI);
|
|
|
|
num_peers = orte_process_info.num_procs;
|
|
|
|
/*
|
|
* Construct Peer name in a ring
|
|
*/
|
|
right_peer_orte_name.jobid = ORTE_PROC_MY_NAME->jobid;
|
|
right_peer_orte_name.vpid = ORTE_PROC_MY_NAME->vpid + 1;
|
|
if( right_peer_orte_name.vpid >= num_peers ) {
|
|
right_peer_orte_name.vpid = 0;
|
|
}
|
|
|
|
left_peer_orte_name.jobid = ORTE_PROC_MY_NAME->jobid;
|
|
left_peer_orte_name.vpid = ORTE_PROC_MY_NAME->vpid - 1;
|
|
if( ORTE_PROC_MY_NAME->vpid == 0 ) {
|
|
left_peer_orte_name.vpid = num_peers - 1;
|
|
}
|
|
|
|
printf("My name is: %s -- PID %d\tMy Left Peer is %s\tMy Right Peer is %s\n",
|
|
ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), getpid(),
|
|
ORTE_NAME_PRINT(&left_peer_orte_name),
|
|
ORTE_NAME_PRINT(&right_peer_orte_name));
|
|
|
|
/*
|
|
* Rank 0 starts the ring...
|
|
*/
|
|
if( ORTE_PROC_MY_NAME->vpid == 0) {
|
|
/* update value */
|
|
counter = 1;
|
|
|
|
/* Send to right */
|
|
msg.iov_base = (void *) &counter;
|
|
msg.iov_len = sizeof(counter);
|
|
|
|
printf("%s Send Counter (%d) to peer %s\n",
|
|
ORTE_NAME_PRINT(ORTE_PROC_MY_NAME),
|
|
counter, ORTE_NAME_PRINT(&right_peer_orte_name));
|
|
|
|
if( 0 > orte_rml.send(&right_peer_orte_name,
|
|
&msg,
|
|
1,
|
|
MY_TAG,
|
|
0) ) {
|
|
printf("error... %d\n", __LINE__);;
|
|
}
|
|
}
|
|
|
|
|
|
while (counter <= MAX_COUNT ) {
|
|
int *cnt;
|
|
|
|
/* Receive from left */
|
|
printf("%s Waiting to Recv Counter from peer %s\n",
|
|
ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), ORTE_NAME_PRINT(&left_peer_orte_name));
|
|
|
|
msg.iov_base = NULL;
|
|
msg.iov_len = 0;
|
|
|
|
if( 0 > orte_rml.recv(&left_peer_orte_name,
|
|
&msg,
|
|
1,
|
|
MY_TAG,
|
|
ORTE_RML_ALLOC) ) {
|
|
printf("error A... %d\n", __LINE__);
|
|
}
|
|
|
|
cnt = (int *) msg.iov_base;
|
|
counter = *cnt;
|
|
|
|
/* Update */
|
|
printf("%s Recv %d ... Send %d\n", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), counter, counter + 1);
|
|
if( ORTE_PROC_MY_NAME->vpid == 0 ) {
|
|
sleep(2);
|
|
}
|
|
if(ORTE_PROC_MY_NAME->vpid == 0) {
|
|
counter++;
|
|
}
|
|
|
|
if(counter > MAX_COUNT && right_peer_orte_name.vpid == 0) {
|
|
break;
|
|
}
|
|
|
|
/* Send to right */
|
|
msg.iov_base = (void *) &counter;
|
|
msg.iov_len = sizeof(counter);
|
|
|
|
printf("%s Send Counter (%d) to peer (%s)\n", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), counter,
|
|
ORTE_NAME_PRINT(&right_peer_orte_name));
|
|
|
|
if( 0 > orte_rml.send(&right_peer_orte_name,
|
|
&msg,
|
|
1,
|
|
MY_TAG,
|
|
0) ) {
|
|
printf("error B... %d\n", __LINE__);;
|
|
}
|
|
}
|
|
|
|
orte_finalize();
|
|
|
|
return 0;
|
|
}
|