from mpi4py import MPI
import numpy as np
def main():
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
K = size # Число процессов
assert K
== 8 or K
== 12, "Число процессов должно быть 8 или 12"
# Размеры решетки
dims = [2, 2, K // 4] # Размерность 2x2x(K/4)
# Индексы координат в решетке для текущего процесса
coords = np.unravel_index(rank, dims)
# Массив данных для текущего процесса
local_data = np.random.random() # Генерация случайного вещественного числа
# Распечатать данные для каждого процесса
print(f"Процесс {rank}: координаты {coords}, значение данных {local_data}")
# Разбиение на столбцы
col_index = coords[2] # Индекс столбца
column_data = np.zeros(K // 4) # Массив для хранения значений одного столбца
# Собираем данные из всех процессов в один столбец
comm.Allgather(local_data, column_data)
# Произведение всех чисел в одном столбце с использованием операции редукции
column_product = np.prod(column_data)
# Определение главного процесса для каждого столбца (процесс 0 в каждом столбце)
if coords[0] == 0 and coords[1] == 0:
print(f"Произведение чисел для столбца {col_index}: {column_product}")
if __name__ == '__main__':
main()
ZnJvbSBtcGk0cHkgaW1wb3J0IE1QSQppbXBvcnQgbnVtcHkgYXMgbnAKCmRlZiBtYWluKCk6CiAgICBjb21tID0gTVBJLkNPTU1fV09STEQKICAgIHJhbmsgPSBjb21tLkdldF9yYW5rKCkKICAgIHNpemUgPSBjb21tLkdldF9zaXplKCkKCiAgICBLID0gc2l6ZSAgIyDQp9C40YHQu9C+INC/0YDQvtGG0LXRgdGB0L7QsgogICAgYXNzZXJ0IEsgPT0gOCBvciBLID09IDEyLCAi0KfQuNGB0LvQviDQv9GA0L7RhtC10YHRgdC+0LIg0LTQvtC70LbQvdC+INCx0YvRgtGMIDgg0LjQu9C4IDEyIgoKICAgICMg0KDQsNC30LzQtdGA0Ysg0YDQtdGI0LXRgtC60LgKICAgIGRpbXMgPSBbMiwgMiwgSyAvLyA0XSAgIyDQoNCw0LfQvNC10YDQvdC+0YHRgtGMIDJ4MngoSy80KQogICAgCiAgICAjINCY0L3QtNC10LrRgdGLINC60L7QvtGA0LTQuNC90LDRgiDQsiDRgNC10YjQtdGC0LrQtSDQtNC70Y8g0YLQtdC60YPRidC10LPQviDQv9GA0L7RhtC10YHRgdCwCiAgICBjb29yZHMgPSBucC51bnJhdmVsX2luZGV4KHJhbmssIGRpbXMpCiAgICAKICAgICMg0JzQsNGB0YHQuNCyINC00LDQvdC90YvRhSDQtNC70Y8g0YLQtdC60YPRidC10LPQviDQv9GA0L7RhtC10YHRgdCwCiAgICBsb2NhbF9kYXRhID0gbnAucmFuZG9tLnJhbmRvbSgpICAjINCT0LXQvdC10YDQsNGG0LjRjyDRgdC70YPRh9Cw0LnQvdC+0LPQviDQstC10YnQtdGB0YLQstC10L3QvdC+0LPQviDRh9C40YHQu9CwCiAgICAKICAgICMg0KDQsNGB0L/QtdGH0LDRgtCw0YLRjCDQtNCw0L3QvdGL0LUg0LTQu9GPINC60LDQttC00L7Qs9C+INC/0YDQvtGG0LXRgdGB0LAKICAgIHByaW50KGYi0J/RgNC+0YbQtdGB0YEge3Jhbmt9OiDQutC+0L7RgNC00LjQvdCw0YLRiyB7Y29vcmRzfSwg0LfQvdCw0YfQtdC90LjQtSDQtNCw0L3QvdGL0YUge2xvY2FsX2RhdGF9IikKCiAgICAjINCg0LDQt9Cx0LjQtdC90LjQtSDQvdCwINGB0YLQvtC70LHRhtGLCiAgICBjb2xfaW5kZXggPSBjb29yZHNbMl0gICMg0JjQvdC00LXQutGBINGB0YLQvtC70LHRhtCwCiAgICBjb2x1bW5fZGF0YSA9IG5wLnplcm9zKEsgLy8gNCkgICMg0JzQsNGB0YHQuNCyINC00LvRjyDRhdGA0LDQvdC10L3QuNGPINC30L3QsNGH0LXQvdC40Lkg0L7QtNC90L7Qs9C+INGB0YLQvtC70LHRhtCwCgogICAgIyDQodC+0LHQuNGA0LDQtdC8INC00LDQvdC90YvQtSDQuNC3INCy0YHQtdGFINC/0YDQvtGG0LXRgdGB0L7QsiDQsiDQvtC00LjQvSDRgdGC0L7Qu9Cx0LXRhgogICAgY29tbS5BbGxnYXRoZXIobG9jYWxfZGF0YSwgY29sdW1uX2RhdGEpCgogICAgIyDQn9GA0L7QuNC30LLQtdC00LXQvdC40LUg0LLRgdC10YUg0YfQuNGB0LXQuyDQsiDQvtC00L3QvtC8INGB0YLQvtC70LHRhtC1INGBINC40YHQv9C+0LvRjNC30L7QstCw0L3QuNC10Lwg0L7Qv9C10YDQsNGG0LjQuCDRgNC10LTRg9C60YbQuNC4CiAgICBjb2x1bW5fcHJvZHVjdCA9IG5wLnByb2QoY29sdW1uX2RhdGEpCgogICAgIyDQntC/0YDQtdC00LXQu9C10L3QuNC1INCz0LvQsNCy0L3QvtCz0L4g0L/RgNC+0YbQtdGB0YHQsCDQtNC70Y8g0LrQsNC20LTQvtCz0L4g0YHRgtC+0LvQsdGG0LAgKNC/0YDQvtGG0LXRgdGBIDAg0LIg0LrQsNC20LTQvtC8INGB0YLQvtC70LHRhtC1KQogICAgaWYgY29vcmRzWzBdID09IDAgYW5kIGNvb3Jkc1sxXSA9PSAwOgogICAgICAgIHByaW50KGYi0J/RgNC+0LjQt9Cy0LXQtNC10L3QuNC1INGH0LjRgdC10Lsg0LTQu9GPINGB0YLQvtC70LHRhtCwIHtjb2xfaW5kZXh9OiB7Y29sdW1uX3Byb2R1Y3R9IikKICAgIAppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgbWFpbigpCg==