Для начала нужно понять ряды. Короче говоря: в контексте многопроцессорности мы обычно предполагаем, что ранг 0 является первым процессом или базовым процессом. Затем другие процессы ранжируются по-разному, например, 1, 2, 3, всего четыре процесса.
Некоторые операции не нужно выполнять параллельно, или вам просто нужен один процесс для некоторой предварительной обработки или кэширования, так что что другие процессы могут использовать эти данные.
В вашем примере, в первом операторе if вводятся неосновные процессы (ранг 1, 2, 3), они будут блокироваться (или «ждать»), потому что сталкиваются с барьером. Они ждут там, потому что barrier()
блокирует, пока все процессы не достигли барьера, но базовый процесс еще не достиг барьера.
Так что на этом этапе неосновные процессы ( 1, 2, 3) заблокированы, но базовый процесс (0) продолжается. Базовый процесс будет выполнять некоторые операции (в данном случае предварительную обработку и кеширование данных), пока не достигнет второго оператора if. Там базовый процесс столкнется с барьером. На этом этапе все процессы остановились на барьере, что означает, что барьер может быть снят и все процессы могут продолжаться. Поскольку базовый процесс подготовил данные, другие процессы теперь могут использовать эти данные.
Возможно, наиболее важная вещь для понимания:
- , когда процесс встречает барьер, он блокирует
- положение барьера не имеет значения (например, не все процессы должны вводить одно и то же выражение if)
- процесс блокируется барьером, пока все процессы не встретят барьер на котором поднимается барьер для всех процессов