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.
Этот коммит содержится в:
родитель
262c927778
Коммит
ce97fc7674
@ -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
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user