ce97fc7674
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.
61 строка
1.6 KiB
C
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;
|
|
}
|