Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
MPI_Status Status;MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &proc_count); MPI_Comm_rank(MPI_COMM_WORLD, &proc_rank); //=================================================================== if ((proc_rank==0) && (proc_count>1)) // Если это "главный" процесс { // и процессов минимум два int n; // Размер массива (изначально неизвестен) cout << "Input n: "; cin >> n; // Вводим с клавиатуры размер массива // Заводим массив на n элементов и заполняем его случайными числами: int *mas; // Указатель на массив типа int mas = new int [n]; // Выделяем память под массив (без проверки) for (int i=0; i<n; i++) // и заполняем случайными числами от 0 до 10 mas[i]=rand()%11; // Распараллелим поиск суммы ровно на два процесса. // Даже если доступных процессорных ядер будет больше, // они не будут использоваться. Ровно два процесса: // текущий процесс с рангом 0 и процесс с рангом 1. // Поскольку процесс 1 не знает о размере массива, он // не может знать, какой объем сообщения ему принимать. // Поэтому мы сначала передадим процессу 1 число, равное // размеру массива. Так процесс 1 сможет подготовить // память под принимаемый массив. MPI_Send (&n, 1, MPI_INT, 1, 0, MPI_COMM_WORLD); // Теперь отсылаем первую половину массива процессу 1 MPI_Send (mas, n/2, MPI_INT, 1, 0, MPI_COMM_WORLD); // Пока процесс 1 обрабатывает первую половину массива, // делаем пока свою часть работы: ищем сумму элементов // оставшейся части массива int S=0; for (int i=n/2; i<n; i++) S=S+mas[i]; // Готовимся получать результат работы процесса 1. // Результатом будет одно число типа int. int S1; // Место под результат // Ждем сообщение от процесса 1 MPI_Recv (&S1, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &Status); S=S+S1; // Складываем обе суммы cout << "S = " << S << endl; delete [] mas; // Освобождаем память, выделенную под массив } // if - процесс 0 //=================================================================== if (proc_rank==1) // Если это процесс с номером 1 { int size; // Размер принимаемого массива int Summa; // Сумма его элементов // Готовимся принять размер массива // Ждем сообщение от процесса 0 MPI_Recv (&size, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &Status); size=size/2; // Мы получили размер всего массива, // но принимать будем только половину // Динамически выделяем память под принимаемый массив int *ptr = new int [size]; // Готовимся принять массив данных // Ждем сообщение от процесса 0 MPI_Recv (ptr, size, MPI_INT, 0, 0, MPI_COMM_WORLD, &Status); // Ищем сумму элементов массива Summa=0; for (int i=0; i<size; i++) Summa+=ptr[i]; // Отсылаем ответ процессу 0 MPI_Send (&Summa, 1, MPI_INT, 0, 0, MPI_COMM_WORLD); delete [] ptr; // Освобождаем память } // if - процесс 1 //===================================================================
|