1
1

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.
Этот коммит содержится в:
Alex Margolin 2014-02-18 13:00:53 +00:00
родитель 262c927778
Коммит ce97fc7674
2 изменённых файлов: 16 добавлений и 13 удалений

Просмотреть файл

@ -28,28 +28,28 @@ int main (int argc, char * argv[])
if(proc == 0)
{
printf("Process 0 puts message %d to %d (%d processes in ring)\n", message, next, nproc);
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. */
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;
--message;
printf("Process 0 decremented value: %d\n", message);
}
shmem_int_put(&rbuf, &message, 1, next);
if(proc != 0) {
--message;
}
}
/* All done */

Просмотреть файл

@ -50,11 +50,14 @@ program ring_oshmem
if (proc == 0) then
message = message - 1
write(*, '("Process 0 decremented value:", i2)') message
else
message = rbuf
end if
call shmem_put8(rbuf, message, 1, next)
if (proc > 0) then
message = message - 1
end if
end do
! All done