Я работаю над проектом, в котором мне нужно реализовать какое-либо обнаружение завершения через переменную, которая изменяется только в корневом процессе программы MPI.
Я изо всех сил пытаюсь понять концепцию блокировкии инструкции по неблокированию.
Короче говоря, только корневой процесс может определить, была ли задача выполнена или нет.Это делается путем реализации простой булевой целочисленной переменной, называемой «running».Это должно быть передано всем процессам, чтобы они знали, когда выходить из своих циклов while.
Все процессы выполняются в своем собственном цикле while.При запуске корневой процесс устанавливает для переменной «running» значение true, если это необходимо.
Затем корневой процесс может определить, должна ли переменная «running» быть установлена на ноль, и должен транслировать ее всем другим процессам.
В настоящее время я использую трансляцию, чтобы поделиться этой переменной.Таким образом, всякий раз, когда цикл достигает своего конца (или «выполняется» устанавливается в ноль), он передает значение всем процессам.Таким образом, каждый процесс имеет широковещательную передачу внутри своей функции для получения значения.
Я либо неправильно понимаю концепцию блокировки, либо моя программа неэффективна.
Широковещательная передача блокирует, таким образом, если root продолжает широковещательную передачупеременная, которая по существу остается неизменной (ИСТИНА) в течение большей части времени выполнения, каждому процессу, по сути, придется ждать, пока корень завершит свою работу, а затем заблокировать, прежде чем этот процесс сможет продолжить свою будущую работу.
Проблема заключается в том, что поскольку эта переменная изменяется только один раз в корневом процессе, во время работы возникает много ненужных блоков.Я хочу, чтобы переменная транслировалась только после того, как она была изменена на ноль, чтобы я мог сказать другим процессам завершить часть своего кода и не ждать, пока корень будет транслировать каждый раз.
if(myRank != 0) {
while(running) {
doThisFunction(myRank);
MPI_Broadcast(... running ...); //Wait for root to broadcast?
}
/* Start doing something else */
} else {
while(running || ... ) {
/* Do stuff */
if (...) {
running = 0; //Somewhere in an if statement
MPI_Broadcast(... running ...); //Now terminate the while
}
MPI_Broadcast(... running ...); //Unnecessary broadcast?
}
}
Я думал, что мог бы использовать MPI_IProbe, чтобы проверить, есть ли сообщение, которое нужно получить, и затем удалить MPI_Broadcast в цикле while корня.Если есть, то процесс инициирует MPI_Broadcast.Если нет, то все будет продолжаться в обычном режиме.
TL; DR:
Моя программа завершает некоторый код в процессах, если значение «running» равно нулю.В настоящее время он транслирует это во время каждой итерации, и я думаю, что это приводит к тому, что в программе появляется ненужный блок.Я хочу отправлять / получать переменную только при ее изменении в корне.
Спасибо за помощь!
edit: "running" - глобальная переменная.