Возможно, вы сможете использовать неблокирование, если, скажем, proc 1 может начать что-то делать со строкой 1, ожидая строки 4. Но блокировка также должна начинаться с нуля.
Существуетмного синхронизации встроено в алгоритм.Каждый должен работать на основе текущей строки.Таким образом, процессы получения должны знать, сколько работы ожидать для каждой итерации этой процедуры.Это легко сделать, если они знают общее количество строк и над какой итерацией они сейчас работают.Поэтому, если они ожидают две строки, они могут сделать две блокирующие записи или запустить две неблокирующие записи, подождать одну и сразу начать обработку первой строки.Но, пожалуй, проще всего сначала заставить блокировку работать.
Даже в самом начале может оказаться полезным, чтобы основной процесс выполнял операции завершения, чтобы все посылки можно было «запускать» одновременно;тогда стойка ожидания может обработать их в любом порядке.
Но лучше, чем это общение «один ко многим», вероятно, будет использовать scatterv, который можно ожидать более эффективным.
Что-тоэто поднималось во многих ответах и комментариях к этой серии вопросов, но я не думаю, что вы когда-либо обращались к ним - я действительно надеюсь, что вы просто работаете над этим проектом в образовательных целях.Было бы совершенно безумно внедрять собственные решатели параллельной линейной алгебры, когда есть настроенные и протестированные инструменты, такие как Scalapack , PETSc и Plapack там бесплатно для скачивания.