Получение только двух процессов для выполнения кода в MPI - не знаю, какие процессы попадут в сегмент кода - PullRequest
0 голосов
/ 24 июля 2011

У меня есть программа MPI на C. Есть часть программы, в которую может попасть произвольное число процессов. Я просто хочу, чтобы 2 процесса что-то делали, а остальные - ничего не делают. Неизвестно, какие идентификаторы процессов достигнут этой части программы, поэтому я не могу сделать это:

if(rank == 0 || rank == 1) { 
  // do something
}
// (else do nothing)

Процессы ранга-0 и ранга-1 здесь никогда не достигнут. Я знаю, что хотя бы два процесса достигнут здесь, хотя.

Как этого достичь в MPI?

Большое спасибо:).

Ответы [ 2 ]

2 голосов
/ 27 июля 2011

Установить ранг 0 (или ранг n-1) как «контрольный ранг».Этот ранг будет содержать два магических жетона для контроля входа в критическую секцию.

Используйте MPI_IRecv на MPI_ANY_SOURCE.Каждый ранг, достигший критической секции кода, будет MPI_Send ранжироваться 0, чтобы идентифицировать себя как достигшего критической секции.Тогда ранг 0 будет MPI_Send, а ранг в критической секции будет MPI_Recv токеном.Первые два ранга, которые достигнут критического кода, будут отправлены жетону «Вперед».Пошлите любые другие ранги токеном «не беспокоить».

В конце цикла будет один непревзойденный MPI_IRecv.Этот MPI_Irecv можно отменить до ввода MPI_Finalize.

2 голосов
/ 24 июля 2011

Запустите два процесса по отдельности, которые вы должны кодировать, чтобы достичь их, а затем используйте определение ранга.

РЕДАКТИРОВАТЬ: сделать общее целое число для всех процессов, которые один процесс будет увеличивать при достижении этого патча кода ито же самое произойдет и в следующем процессе, и пометит соответствующий код условием if, чтобы он не работал, если только это общее целое число меньше 2.

...